這篇文章主要為大家展示了“java如何實(shí)現(xiàn)上傳圖片文件功能”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“java如何實(shí)現(xiàn)上傳圖片文件功能”這篇文章吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、安寧網(wǎng)站維護(hù)、網(wǎng)站推廣。
總的說圖片上傳有兩種方式,一種是把圖片文件寫到數(shù)據(jù)庫中,另一種是存到 在jsp中使用了該格式,對(duì)應(yīng)的Servlet就不能使用request.getParameter()取得參數(shù),要使用ServletFileUpload對(duì)象的parseRequest方法先把request對(duì)象中的數(shù)據(jù)解析,然后,使用解析出的元素的isFormField標(biāo)志,配合getFieldName方法來獲取數(shù)據(jù)。 3、FileUploadServlet的實(shí)現(xiàn): 該類繼承了AbstractItemServlet: 所有物料Servlet的抽象父類,負(fù)責(zé)實(shí)例化ItemManager ItemManagerImpl是實(shí)現(xiàn)了ItemManager接口的子類。這種設(shè)計(jì)模式有一個(gè)問題,有待遇優(yōu)化,但這里為了說明圖片上傳,不多做無關(guān)的贅述。 總結(jié): 關(guān)于init()初始化方法: 處理普通文本數(shù)據(jù): 上傳是很多年比較成熟的技術(shù),有很多已經(jīng)封裝好的,我們平時(shí)的項(xiàng)目中可以直接拿來用,但是了解一些基本的原理是必不可少的。 以上是“java如何實(shí)現(xiàn)上傳圖片文件功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!package com.bjpowernode.drp.basedata.web;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.bjpowernode.drp.basedata.manager.ItemManager;
import com.bjpowernode.drp.basedata.manager.ItemManagerImpl;
import com.bjpowernode.drp.util.ApplicationException;
public class FileUploadServlet extends AbstractItemServlet {
private File uploadPath;
private File tempPath;
@Override
public void init() throws ServletException {
//在系統(tǒng)啟動(dòng)的時(shí)候,就開始初始化,在初始化時(shí),檢查上傳圖片的文件夾和存放臨時(shí)文件的文件夾是否存在,如果不存在,就創(chuàng)建
//獲取根目錄對(duì)應(yīng)的真實(shí)物理路徑
uploadPath = new File(getServletContext().getRealPath("upload"));
System.out.println("uploadPath=====" + uploadPath);
//如果目錄不存在
if (!uploadPath.exists()) {
//創(chuàng)建目錄
uploadPath.mkdir();
}
//臨時(shí)目錄
//File tempFile = new File(item.getName())構(gòu)造臨時(shí)對(duì)象
tempPath = new File(getServletContext().getRealPath("temp"));
if (!tempPath.exists()) {
tempPath.mkdir();
}
//如果不顯示調(diào)用父類方法,就不會(huì)有itemManager實(shí)例,因此會(huì)造成空指針
super.init();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//從item_upload.jsp中拿取數(shù)據(jù),因?yàn)樯蟼黜摰木幋a格式跟一般的不同,使用的是enctype="multipart/form-data"
//form提交采用multipart/form-data,無法采用req.getParameter()取得數(shù)據(jù)
//String itemNo = req.getParameter("itemNo");
//System.out.println("itemNo======" + itemNo);
/********************************使用 FileUpload 組件解析表單********************/
//DiskFileItemFactory:創(chuàng)建 FileItem 對(duì)象的工廠,在這個(gè)工廠類中可以配置內(nèi)存緩沖區(qū)大小和存放臨時(shí)文件的目錄。
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(4096);
// the location for saving data that is larger than getSizeThreshold()
factory.setRepository(tempPath);
//ServletFileUpload:負(fù)責(zé)處理上傳的文件數(shù)據(jù),并將每部分的數(shù)據(jù)封裝成一到 FileItem 對(duì)象中。
//在接收上傳文件數(shù)據(jù)時(shí),會(huì)將內(nèi)容保存到內(nèi)存緩存區(qū)中,如果文件內(nèi)容超過了 DiskFileItemFactory 指定的緩沖區(qū)的大小,
//那么文件將被保存到磁盤上,存儲(chǔ)為 DiskFileItemFactory 指定目錄中的臨時(shí)文件。
//等文件數(shù)據(jù)都接收完畢后,ServletUpload再從文件中將數(shù)據(jù)寫入到上傳文件目錄下的文件中
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum size before a FileUploadException will be thrown
upload.setSizeMax(1000000 * 20);
/**********解析表單傳遞過來的數(shù)據(jù),返回List集合數(shù)據(jù)-類型:FileItem***********/
try {
List fileItems = upload.parseRequest(request);
String itemNo = "";
//Iterator iter = fileItems.iterator()取其迭代器
//iter.hasNext()檢查序列中是否還有元素
for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
//獲得序列中的下一個(gè)元素
FileItem item = (FileItem) iter.next();
//判斷是文件還是文本信息
//是普通的表單輸入域
if(item.isFormField()) {
if ("itemNo".equals(item.getFieldName())) {
itemNo = item.getString();
}
}
//是否為input="type"輸入域
if (!item.isFormField()) {
//上傳文件的名稱和完整路徑
String fileName = item.getName();
long size = item.getSize();
//判斷是否選擇了文件
if ((fileName == null || fileName.equals("")) && size == 0) {
continue;
}
//截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
// 保存文件在服務(wù)器的物理磁盤中:第一個(gè)參數(shù)是:完整路徑(不包括文件名)第二個(gè)參數(shù)是:文件名稱
//item.write(file);
//修改文件名和物料名一致,且強(qiáng)行修改了文件擴(kuò)展名為gif
//item.write(new File(uploadPath, itemNo + ".gif"));
//將文件保存到目錄下,不修改文件名
item.write(new File(uploadPath, fileName));
//將圖片文件名寫入打數(shù)據(jù)庫
itemManager.uploadItemImage(itemNo, fileName);
}
}
response.sendRedirect(request.getContextPath() + "/servlet/item/SearchItemServlet");
} catch (Exception e) {
e.printStackTrace();
throw new ApplicationException("上傳失??!");
}
}
}
/**
* 所有物料Servlet的抽象父類,負(fù)責(zé)實(shí)例化ItemManager
* @author LiMin
*
*/
public abstract class AbstractItemServlet extends HttpServlet {
//雖然不是線程安全的,但是如果只讀的話,是不會(huì)有錯(cuò)誤的
protected ItemManager itemManager = null;
@Override
public void init() throws ServletException {
itemManager = new ItemManagerImpl()
}
}
在Servlet初始化的時(shí)候,就動(dòng)態(tài)創(chuàng)建目錄,這里是把一個(gè)upload和臨時(shí)文件tempPath創(chuàng)建到了tomcat的webapps下的項(xiàng)目的跟目錄中。
值得注意點(diǎn)是這里需要顯示調(diào)用super.init()方法(super不是父類對(duì)象的引用,但是負(fù)責(zé)父類的方法的調(diào)用),否則,可能會(huì)造成該類的空指針。
上傳大致分三步執(zhí)行:使用 FileUpload 組件解析表單;解析表單傳遞過來的數(shù)據(jù),返回List集合數(shù)據(jù)-類型:FileItem;最后上傳圖片。
使用FileItem的isFormField()方法判斷是普通文本還是文件;
使用FileItem.write(new File(uploadPath, fileName))上傳文件,第一個(gè)參數(shù)是:完整路徑(不包括文件名)第二個(gè)參數(shù)是:文件名稱; if ("itemNo".equals(item.getFieldName())) {
itemNo = item.getString();
}
新聞名稱:java如何實(shí)現(xiàn)上傳圖片文件功能
文章轉(zhuǎn)載:http://weahome.cn/article/gidggp.html