新聞中心
隨著互聯(lián)網(wǎng)的發(fā)展,圖片已經(jīng)成為傳遞信息的重要手段之一。在很多網(wǎng)站上,用戶需要上傳圖片來(lái)展示自己的信息或者分享一些內(nèi)容。而如何實(shí)現(xiàn)圖片的上傳和存儲(chǔ)則是一個(gè)非常關(guān)鍵的問(wèn)題。本文將介紹如何使用Java語(yǔ)言實(shí)現(xiàn)圖片上傳并存儲(chǔ)到數(shù)據(jù)庫(kù)中。

創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元東光做網(wǎng)站,已為上家服務(wù),為東光各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
一、準(zhǔn)備工作
在實(shí)現(xiàn)圖片上傳和存儲(chǔ)之前,我們需要準(zhǔn)備好一些工具和環(huán)境。我們需要安裝Java開(kāi)發(fā)環(huán)境(JDK)和集成開(kāi)發(fā)環(huán)境(IDE),本文使用的是JDK8和Eclipse。我們需要使用Tomcat作為Web服務(wù)器。我們需要使用MySQL數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)上傳的圖片。
二、編寫(xiě)上傳頁(yè)面
我們需要編寫(xiě)一個(gè)上傳頁(yè)面,讓用戶可以選擇要上傳的圖片。在這個(gè)頁(yè)面中,需要使用HTML表單來(lái)實(shí)現(xiàn)文件上傳的功能。下面是一個(gè)簡(jiǎn)單的HTML表單代碼示例:
“`
上傳圖片
選擇文件:
“`
在這個(gè)表單中,我們使用了enctype=”multipart/form-data”來(lái)指定上傳的文件類型,并使用了input type=”file”來(lái)創(chuàng)建文件選擇框。表單的action屬性指向我們即將編寫(xiě)的Servlet。
三、編寫(xiě)Servlet
在前面的步驟中,我們已經(jīng)創(chuàng)建了一個(gè)上傳頁(yè)面,現(xiàn)在我們需要編寫(xiě)一個(gè)Servlet來(lái)處理由該頁(yè)面提交的文件。Servlet是Java Web開(kāi)發(fā)中的基本組成部分,它可以接收客戶端請(qǐng)求并返回響應(yīng)結(jié)果。
創(chuàng)建一個(gè)名為UploadServlet的Java類,并繼承HttpServlet。然后,我們需要重寫(xiě)doPost方法,用于處理POST請(qǐng)求。下面是一個(gè)簡(jiǎn)單的示例代碼:
“`
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet(“/uploadServlet”)
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 上傳文件存儲(chǔ)目錄
private static final String UPLOAD_DIRECTORY = “upload”;
// 數(shù)據(jù)庫(kù)連接信息
private static final String JDBC_DRIVER = “com.mysql.jdbc.Driver”;
private static final String DB_URL = “jdbc:mysql://localhost:3306/test”;
private static final String DB_USER = “root”;
private static final String DB_PASSWORD = “”;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html;charset=UTF-8”);
// 獲取上傳的文件
Part filePart = request.getPart(“file”);
String fileName = getFileName(filePart);
// 連接數(shù)據(jù)庫(kù)
Connection conn = null;
PreparedStatement stmt = null;
try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
// 插入數(shù)據(jù)庫(kù)
String sql = “INSERT INTO images (filename, filepath) values (?, ?)”;
stmt = conn.prepareStatement(sql);
stmt.setString(1, fileName);
stmt.setString(2, UPLOAD_DIRECTORY + File.separator + fileName);
stmt.executeUpdate();
// 保存文件到磁盤(pán)
String uploadPath = getServletContext().getRealPath(“”) + UPLOAD_DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
filePart.write(uploadPath + File.separator + fileName);
// 成功上傳
PrintWriter out = response.getWriter();
out.println(“文件上傳成功!”);
out.close();
} catch (ClassNotFoundException | SQLException ex) {
ex.printStackTrace();
response.sendRedirect(“error.html”); // 處理上傳失敗情況
} finally {
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
private String getFileName(final Part part) {
final String partHeader = part.getHeader(“content-disposition”);
for (String content : partHeader.split(“;”)) {
if (content.trim().startsWith(“filename”)) {
return content.substring(content.indexOf(‘=’) + 1).trim().replace(“\””, “”);
}
}
return null;
}
}
“`
在Servlet中,我們首先獲取上傳的文件和文件名,然后連接MySQL數(shù)據(jù)庫(kù),將文件名和路徑插入到數(shù)據(jù)庫(kù)中。接著,我們將上傳的文件保存到web應(yīng)用根目錄下的upload文件夾中。
四、創(chuàng)建數(shù)據(jù)庫(kù)表
在我們的Java程序中,我們使用了MySQL數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)上傳的圖片。因此,在使用程序之前,我們需要?jiǎng)?chuàng)建一個(gè)名為“images”的表來(lái)存儲(chǔ)圖片信息。
“`
CREATE TABLE images (
id int(11) NOT NULL AUTO_INCREMENT,
filename varchar(255) DEFAULT NULL,
filepath varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
“`
在這個(gè)表中,我們定義了三個(gè)列,分別是id、filename和filepath。其中,id列是自動(dòng)遞增的主鍵。
五、測(cè)試上傳功能
現(xiàn)在,我們已經(jīng)完成了Java實(shí)現(xiàn)圖片上傳和數(shù)據(jù)庫(kù)存儲(chǔ)的所有步驟。接下來(lái),我們需要測(cè)試一下我們的程序是否可以正常工作。
我們需要將上傳頁(yè)面和Servlet部署到Tomcat服務(wù)器中。然后,我們啟動(dòng)Tomcat服務(wù)器,并在瀏覽器中訪問(wèn)上傳頁(yè)面。
選擇一個(gè)圖片文件并點(diǎn)擊上傳按鈕,我們會(huì)看到一個(gè)成功上傳的提示信息。同時(shí),這個(gè)圖片會(huì)被保存到我們的數(shù)據(jù)庫(kù)和web應(yīng)用根目錄下的upload文件夾中。
六、
在本文中,我們介紹了如何使用Java語(yǔ)言實(shí)現(xiàn)圖片上傳并存儲(chǔ)到數(shù)據(jù)庫(kù)中。通過(guò)使用這個(gè)程序,我們可以輕松地實(shí)現(xiàn)圖片上傳和存儲(chǔ),并且可以方便地獲取上傳的圖片信息。除此之外,我們還可以根據(jù)我們的需求修改這個(gè)程序,使其更加符合我們的實(shí)際情況。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
Java web 問(wèn)題圖片怎么存儲(chǔ)到數(shù)據(jù)庫(kù)。
package shop.car.control;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;
import shop.car.model.GoodService;
import com.jspart.upload.SmartUpload;
import com.jspart.upload.SmartUploadException;
public class ImageInput extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
PageContext pageContext = null;
JspFactory jsp = null;
// 實(shí)例化上載bean
SmartUpload mySmartUpload = new SmartUpload();
jsp = JspFactory.getDefaultFactory();
pageContext = jsp.getPageContext(this, request, response, “”鉛虧謹(jǐn), true,
8192, true);
// 初始化
mySmartUpload.initialize(pageContext);
// 設(shè)置上載的更大值
mySmartUpload.setMaxFileSize(500 * 1024 * 1024);
// 設(shè)定允許上傳的文件(通過(guò)擴(kuò)展名限制)
mySmartUpload.setAllowedFilesList(“jpg”);
// 上載文件
try {
mySmartUpload.upload();
} catch (SmartUploadException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
int count = 0;
try {
count = mySmartUpload.save(“/upload”, SmartUpload.SAVE_VIRTUAL);
} catch (SmartUploadException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
out.println(count + “個(gè)文件上傳成功!
“);
out.println(“空凳TEST=” + mySmartUpload.getRequest().getParameter(“TEST”)
+ “”);
// 循環(huán)取得所有上載的文件
for (int i = 0; i
// 取得上載的文件
com.jspart.upload.File myFile = mySmartUpload.getFiles().getFile(
i);
if (!myFile.isMissing()) {
// 取得上載的文件的文件名
String myFileName = myFile.getFileName();
// 取得不帶后綴的文件名
String suffix = myFileName.substring(0, myFileName
.lastIndexOf(‘.’));
// 取得后綴名
String ext = mySmartUpload.getFiles().getFile(0).getFileExt();
// 取得文件的大小
int fileSize = myFile.getSize();
// 保存路徑
String aa = request.getRealPath(request.getServletPath())
+ myFileName;
String trace = aa + myFileName;
String s=new String(trace.getBytes(“ISO”),”utf-8″);
// 取得別的參數(shù)
String explain = (String) mySmartUpload.getRequest()
.getParameter(“text”);
String send = (String) mySmartUpload.getRequest().getParameter(
“send”);
// 將文件保存在服務(wù)器端
try {
myFile.saveAs(trace, SmartUpload.SAVE_PHYSICAL);
} catch (SmartUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 下面的是將上載的文件保存到數(shù)據(jù)庫(kù)中
// 將文件讀到流中
java.io.File file = new java.io.File(s);
java.io.FileInputStream fis = new java.io.FileInputStream(file);
out.println(file.length());
GoodService.addGoods(fis, file);
out.println((“上載成功!?。 ?.toString());
} else {
out.println((“上載失?。。?!”).toString());
}
}// 與前面的if對(duì)應(yīng)
out.flush();
out.close();
}
}
一般數(shù)據(jù)庫(kù)只存圖片的路徑。你可以在web下建一個(gè)目錄(images),然后把上傳的圖片放在里面。更好是用檔巧系統(tǒng)時(shí)間命名,避免沖突。
具體路徑是通過(guò)request.getRealPath(“images”)得到,讓后把圖片改名放進(jìn)去。
數(shù)據(jù)庫(kù)記住相對(duì)的路徑(1111.jpg)就可以了,在頁(yè)面逗搏可以—-pic—
Java 保存圖片到數(shù)據(jù)庫(kù)時(shí),為什么要對(duì)圖片進(jìn)行base64編碼
保密和字符處理
首先這是一種碼攔SB做扒模世法,圖片保存到數(shù)據(jù)庫(kù)這個(gè)很浪費(fèi)數(shù)據(jù)庫(kù)資源, 通常情況下圖片等文件都是用ftp服務(wù)器來(lái)存儲(chǔ)文件的春肢. 為什么要用base64進(jìn)行編碼是因?yàn)? base64會(huì)把文件這個(gè)文件轉(zhuǎn)換成字符串, base64編碼后得到的是一組字符串, 為什么要用blob類型, 因?yàn)檫@個(gè)類型可以存儲(chǔ)4GB數(shù)據(jù), 數(shù)據(jù)庫(kù)中普通的 varchar varchar2 text等類型都有長(zhǎng)度的限制
因?yàn)槎M(jìn)制數(shù)據(jù)無(wú)法使用弊塌鎮(zhèn)格式化的傳輸(如xml、json),而B(niǎo)ase64提供了剔除特殊字符(如
考慮一個(gè)接口可能會(huì)同時(shí)返回一個(gè)圖片的數(shù)據(jù),加上這個(gè)圖片的說(shuō)明,使用json返回的時(shí)候就必須要對(duì)圖片信息進(jìn)行Base64編碼。否則,你只能返回一個(gè)url,然后讓客戶端再使用這個(gè)url獲取圖片信息。
上面只是討論Base64的用處,至于存儲(chǔ)在數(shù)據(jù)庫(kù)是什么無(wú)所謂。本人還是傾向于原始的二進(jìn)制數(shù)據(jù),畢竟如果只有一個(gè)地方存儲(chǔ)這些數(shù)據(jù),那么保存原始數(shù)據(jù)能保證不會(huì)失去任何精度。
關(guān)于java 圖片 數(shù)據(jù)庫(kù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡(jiǎn)稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開(kāi)通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問(wèn)快、穩(wěn)定!
當(dāng)前題目:Java實(shí)現(xiàn)圖片上傳及數(shù)據(jù)庫(kù)存儲(chǔ)(java圖片數(shù)據(jù)庫(kù))
網(wǎng)站鏈接:http://www.5511xx.com/article/coophgi.html


咨詢
建站咨詢
