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

創(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)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元東光做網(wǎng)站,已為上家服務(wù),為東光各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
一、準(zhǔn)備工作
在實(shí)現(xiàn)圖片上傳和存儲之前,我們需要準(zhǔn)備好一些工具和環(huán)境。我們需要安裝Java開發(fā)環(huán)境(JDK)和集成開發(fā)環(huán)境(IDE),本文使用的是JDK8和Eclipse。我們需要使用Tomcat作為Web服務(wù)器。我們需要使用MySQL數(shù)據(jù)庫來存儲上傳的圖片。
二、編寫上傳頁面
我們需要編寫一個上傳頁面,讓用戶可以選擇要上傳的圖片。在這個頁面中,需要使用HTML表單來實(shí)現(xiàn)文件上傳的功能。下面是一個簡單的HTML表單代碼示例:
“`
上傳圖片
選擇文件:
“`
在這個表單中,我們使用了enctype=”multipart/form-data”來指定上傳的文件類型,并使用了input type=”file”來創(chuàng)建文件選擇框。表單的action屬性指向我們即將編寫的Servlet。
三、編寫Servlet
在前面的步驟中,我們已經(jīng)創(chuàng)建了一個上傳頁面,現(xiàn)在我們需要編寫一個Servlet來處理由該頁面提交的文件。Servlet是Java Web開發(fā)中的基本組成部分,它可以接收客戶端請求并返回響應(yīng)結(jié)果。
創(chuàng)建一個名為UploadServlet的Java類,并繼承HttpServlet。然后,我們需要重寫doPost方法,用于處理POST請求。下面是一個簡單的示例代碼:
“`
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;
// 上傳文件存儲目錄
private static final String UPLOAD_DIRECTORY = “upload”;
// 數(shù)據(jù)庫連接信息
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ù)庫
Connection conn = null;
PreparedStatement stmt = null;
try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
// 插入數(shù)據(jù)庫
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();
// 保存文件到磁盤
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ù)庫,將文件名和路徑插入到數(shù)據(jù)庫中。接著,我們將上傳的文件保存到web應(yīng)用根目錄下的upload文件夾中。
四、創(chuàng)建數(shù)據(jù)庫表
在我們的Java程序中,我們使用了MySQL數(shù)據(jù)庫來存儲上傳的圖片。因此,在使用程序之前,我們需要創(chuàng)建一個名為“images”的表來存儲圖片信息。
“`
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;
“`
在這個表中,我們定義了三個列,分別是id、filename和filepath。其中,id列是自動遞增的主鍵。
五、測試上傳功能
現(xiàn)在,我們已經(jīng)完成了Java實(shí)現(xiàn)圖片上傳和數(shù)據(jù)庫存儲的所有步驟。接下來,我們需要測試一下我們的程序是否可以正常工作。
我們需要將上傳頁面和Servlet部署到Tomcat服務(wù)器中。然后,我們啟動Tomcat服務(wù)器,并在瀏覽器中訪問上傳頁面。
選擇一個圖片文件并點(diǎn)擊上傳按鈕,我們會看到一個成功上傳的提示信息。同時(shí),這個圖片會被保存到我們的數(shù)據(jù)庫和web應(yīng)用根目錄下的upload文件夾中。
六、
在本文中,我們介紹了如何使用Java語言實(shí)現(xiàn)圖片上傳并存儲到數(shù)據(jù)庫中。通過使用這個程序,我們可以輕松地實(shí)現(xiàn)圖片上傳和存儲,并且可以方便地獲取上傳的圖片信息。除此之外,我們還可以根據(jù)我們的需求修改這個程序,使其更加符合我們的實(shí)際情況。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
Java web 問題圖片怎么存儲到數(shù)據(jù)庫。
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è)定允許上傳的文件(通過擴(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 + “個文件上傳成功!
“);
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ù)庫中
// 將文件讀到流中
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對應(yīng)
out.flush();
out.close();
}
}
一般數(shù)據(jù)庫只存圖片的路徑。你可以在web下建一個目錄(images),然后把上傳的圖片放在里面。更好是用檔巧系統(tǒng)時(shí)間命名,避免沖突。
具體路徑是通過request.getRealPath(“images”)得到,讓后把圖片改名放進(jìn)去。
數(shù)據(jù)庫記住相對的路徑(1111.jpg)就可以了,在頁面逗搏可以—-pic—
Java 保存圖片到數(shù)據(jù)庫時(shí),為什么要對圖片進(jìn)行base64編碼
保密和字符處理
首先這是一種碼攔SB做扒模世法,圖片保存到數(shù)據(jù)庫這個很浪費(fèi)數(shù)據(jù)庫資源, 通常情況下圖片等文件都是用ftp服務(wù)器來存儲文件的春肢. 為什么要用base64進(jìn)行編碼是因?yàn)? base64會把文件這個文件轉(zhuǎn)換成字符串, base64編碼后得到的是一組字符串, 為什么要用blob類型, 因?yàn)檫@個類型可以存儲4GB數(shù)據(jù), 數(shù)據(jù)庫中普通的 varchar varchar2 text等類型都有長度的限制
因?yàn)槎M(jìn)制數(shù)據(jù)無法使用弊塌鎮(zhèn)格式化的傳輸(如xml、json),而Base64提供了剔除特殊字符(如
考慮一個接口可能會同時(shí)返回一個圖片的數(shù)據(jù),加上這個圖片的說明,使用json返回的時(shí)候就必須要對圖片信息進(jìn)行Base64編碼。否則,你只能返回一個url,然后讓客戶端再使用這個url獲取圖片信息。
上面只是討論Base64的用處,至于存儲在數(shù)據(jù)庫是什么無所謂。本人還是傾向于原始的二進(jìn)制數(shù)據(jù),畢竟如果只有一個地方存儲這些數(shù)據(jù),那么保存原始數(shù)據(jù)能保證不會失去任何精度。
關(guān)于java 圖片 數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),香港虛擬主機(jī)被稱為香港虛擬空間/香港網(wǎng)站空間,或者簡稱香港主機(jī)/香港空間。香港虛擬主機(jī)特點(diǎn)是免備案空間開通就用, 創(chuàng)新互聯(lián)香港主機(jī)精選cn2+bgp線路訪問快、穩(wěn)定!
網(wǎng)頁標(biāo)題:Java實(shí)現(xiàn)圖片上傳及數(shù)據(jù)庫存儲(java圖片數(shù)據(jù)庫)
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/coophgi.html


咨詢
建站咨詢
