JSP實現(xiàn)文件上傳功能
本文實例為大家分享了jsp實現(xiàn)文件上傳功能的具體代碼,供大家參考,具體內(nèi)容如下
一、準備部分
需要fileupload.jar與io.jar包共同完成。構(gòu)建完成路徑后可繼續(xù)。
二、頁面部分
<form action="uploadservlet" method="post" enctype="multipart/form-data"> 學號:<input type="text" name="sno"/><br/> 姓名:<input type="text" name="sname"/><br/> 上傳照片:<input type="file" name="spicture"/><br/> <input type="submit" value="注冊"/> </form>
注意:
1.文件上傳必須要使用post,以避免用get方法時傳輸總量超過搜索框所能承載最大字符數(shù)。
2.必須加入enctype="multipart.form-data"字段
3.文件處需用“file”
三、servlet部分
package webtest; import java.io.file; import java.io.ioexception; import java.util.iterator; import java.util.list; 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 org.apache.commons.fileupload.fileitem; import org.apache.commons.fileupload.fileitemfactory; import org.apache.commons.fileupload.fileuploadbase; import org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.disk.diskfileitemfactory; import org.apache.commons.fileupload.servlet.servletfileupload; /** * servlet implementation class uploadservlet */ @webservlet("/uploadservlet") public class uploadservlet extends httpservlet { private static final long serialversionuid = 1l; protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { request.setcharacterencoding("utf-8");// 請求編碼處理,傳輸時 response.setcharacterencoding("utf-8");// 響應編碼處理,傳輸時 response.setcontenttype("utf-8");// 響應編碼處理,顯示時 boolean ismultipart = servletfileupload.ismultipartcontent(request);// 判斷是否有entype="multipart/form-data"部分 if (ismultipart) { try { fileitemfactory factory = new diskfileitemfactory(); servletfileupload upload = new servletfileupload(factory); //設(shè)置上傳時的內(nèi)存緩沖區(qū)大小,超出時寫入臨時文件 10kb ((diskfileitemfactory) factory).setsizethreshold(10240);//單位byte //設(shè)置臨時文件目錄,防止系統(tǒng)空間不足 ((diskfileitemfactory) factory).setrepository(new file(request.getsession().getservletcontext().getrealpath("uploadtemp")));//動態(tài)獲取uploadtemp文件夾位于該項目中的位置 //控制上傳單個文件的最大值 20kb upload.setsizemax(20480);//單位byte list<fileitem> items = upload.parserequest(request);// 解析form中的所有請求字段,并保存在item中 iterator<fileitem> iter = items.iterator(); while (iter.hasnext()) { // 解析時無順序,因此需根據(jù)名字查找 fileitem item = iter.next(); if (item.isformfield()) {//非文件數(shù)據(jù) string itemname = item.getfieldname();//獲取非文件的范圍數(shù)據(jù)名 if (itemname.equals("sno")) { int sno = -1; sno = integer.parseint(item.getstring("utf-8")); } else if (itemname.equals("sname")) { string sname = null; sname = item.getstring("utf-8"); } else { system.out.println("其他字段..."); } } else {//文件上傳 string filename = item.getname();//獲取文件范圍數(shù)據(jù)。路徑及其名稱 //判斷文件類型 string ext = filename.substring(filename.indexof(".")+1); if(!(ext.equals("png")||ext.equals("gif")||ext.equals("jpg"))) { system.out.println("僅支持png.gif,jpg類型文件"); return ; } string path = request.getsession().getservletcontext().getrealpath("upload");//動態(tài)獲取upload文件夾位于該項目中的位置 file file = new file(path,filename); item.write(file);//定義上傳路徑,多為服務器路徑 system.out.println(filename+"上傳成功"); } item.delete();//刪除臨時目錄的文件 } } catch(fileuploadbase.sizelimitexceededexception e) { system.out.println("最大20kb"); } catch (fileuploadexception e) { // todo auto-generated catch block e.printstacktrace(); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } } } /** * @see httpservlet#dopost(httpservletrequest request, httpservletresponse * response) */ protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // todo auto-generated method stub doget(request, response); } }
注:
1.若該處標紅且鼠標懸停后未找到包,則可以使用"alt"+"/"組合鍵選擇下圖第一個類來導入。
2.由于若upload與uploadtemp文件存放于tomcat對應的項目下,每一次通過eclipse更新代碼,會將eclipse下代碼直接覆蓋,因而兩個文件夾會直接被覆蓋掉。可以在eclipse中新建,或通過絕對/相對路徑于其他文件夾中來設(shè)置。
3.臨時文件中的數(shù)據(jù)會保留很短的時間,添加sleep讓程序休眠也許可以看到。即使無item.delete(),在整個會話完成后,臨時文件也會被刪除。
4.若報錯無法找到文件,請嘗試用瀏覽器若谷歌進行操作,而不是用eclipse自帶的。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持碩編程。