JSP實(shí)現(xiàn)文件上傳功能
本文實(shí)例為大家分享了JSP實(shí)現(xiàn)文件上傳功能的具體代碼,供大家參考,具體內(nèi)容如下
一、準(zhǔn)備部分
需要fileupload.jar與io.jar包共同完成。構(gòu)建完成路徑后可繼續(xù)。
二、頁(yè)面部分
<form action="UploadServlet" method="post" enctype="multipart/form-data"> 學(xué)號(hào):<input type="text" name="sno"/><br/> 姓名:<input type="text" name="sname"/><br/> 上傳照片:<input type="file" name="spicture"/><br/> <input type="submit" value="注冊(cè)"/> </form>
注意:
1.文件上傳必須要使用post,以避免用get方法時(shí)傳輸總量超過(guò)搜索框所能承載最大字符數(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");// 請(qǐng)求編碼處理,傳輸時(shí) response.setCharacterEncoding("utf-8");// 響應(yīng)編碼處理,傳輸時(shí) response.setContentType("utf-8");// 響應(yīng)編碼處理,顯示時(shí) boolean isMultipart = ServletFileUpload.isMultipartContent(request);// 判斷是否有entype="multipart/form-data"部分 if (isMultipart) { try { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); //設(shè)置上傳時(shí)的內(nèi)存緩沖區(qū)大小,超出時(shí)寫入臨時(shí)文件 10kb ((DiskFileItemFactory) factory).setSizeThreshold(10240);//單位byte //設(shè)置臨時(shí)文件目錄,防止系統(tǒng)空間不足 ((DiskFileItemFactory) factory).setRepository(new File(request.getSession().getServletContext().getRealPath("Uploadtemp")));//動(dòng)態(tài)獲取Uploadtemp文件夾位于該項(xiàng)目中的位置 //控制上傳單個(gè)文件的最大值 20kb upload.setSizeMax(20480);//單位byte List<FileItem> items = upload.parseRequest(request);// 解析form中的所有請(qǐng)求字段,并保存在item中 Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { // 解析時(shí)無(wú)順序,因此需根據(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");//動(dòng)態(tài)獲取Upload文件夾位于該項(xiàng)目中的位置 File file = new File(path,fileName); item.write(file);//定義上傳路徑,多為服務(wù)器路徑 System.out.println(fileName+"上傳成功"); } item.delete();//刪除臨時(shí)目錄的文件 } } 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.若該處標(biāo)紅且鼠標(biāo)懸停后未找到包,則可以使用"alt"+"/"組合鍵選擇下圖第一個(gè)類來(lái)導(dǎo)入。
2.由于若Upload與Uploadtemp文件存放于tomcat對(duì)應(yīng)的項(xiàng)目下,每一次通過(guò)eclipse更新代碼,會(huì)將eclipse下代碼直接覆蓋,因而兩個(gè)文件夾會(huì)直接被覆蓋掉??梢栽趀clipse中新建,或通過(guò)絕對(duì)/相對(duì)路徑于其他文件夾中來(lái)設(shè)置。
3.臨時(shí)文件中的數(shù)據(jù)會(huì)保留很短的時(shí)間,添加sleep讓程序休眠也許可以看到。即使無(wú)item.delete(),在整個(gè)會(huì)話完成后,臨時(shí)文件也會(huì)被刪除。
4.若報(bào)錯(cuò)無(wú)法找到文件,請(qǐng)嘗試用瀏覽器若谷歌進(jìn)行操作,而不是用Eclipse自帶的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring AOP 動(dòng)態(tài)多數(shù)據(jù)源的實(shí)例詳解
這篇文章主要介紹了 Spring AOP 動(dòng)態(tài)多數(shù)據(jù)源的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文可以幫助到大家,需要的朋友可以參考下2017-08-08JSP頁(yè)面中如何用select標(biāo)簽實(shí)現(xiàn)級(jí)聯(lián)
在JSP頁(yè)面中如何用select標(biāo)簽實(shí)現(xiàn)級(jí)聯(lián)呢?以下小編就為大家介紹實(shí)現(xiàn)方法,需要的朋友可以參考下2013-07-07Java中使用HttpRequest獲取用戶真實(shí)IP地址
這篇文章主要介紹了Java中使用HttpRequest獲取用戶真實(shí)IP地址,使用本文方法可以避免Apache、Squid、nginx等反向代理軟件導(dǎo)致的非真實(shí)IP地址,需要的朋友可以參考下2015-06-06