JSP 文件上傳
jsp 文件上傳
jsp 可以與 html form 標(biāo)簽一起使用,來允許用戶上傳文件到服務(wù)器。上傳的文件可以是文本文件或圖像文件或任何文檔。
本章節(jié)我們使用 servlet 來處理文件上傳,使用到的文件有:
- upload.jsp : 文件上傳表單。
- message.jsp : 上傳成功后跳轉(zhuǎn)頁面。
- uploadservlet.java : 上傳處理 servlet。
- 需要引入的 jar 文件:commons-fileupload-1.3.2、commons-io-2.5.jar。
結(jié)構(gòu)圖如下所示:
接下來我們?cè)敿?xì)介紹。
創(chuàng)建一個(gè)文件上傳表單
下面的 html 代碼創(chuàng)建了一個(gè)文件上傳表單。以下幾點(diǎn)需要注意:
- 表單 method 屬性應(yīng)該設(shè)置為 post 方法,不能使用 get 方法。
- 表單 enctype 屬性應(yīng)該設(shè)置為 multipart/form-data.
- 表單 action 屬性應(yīng)該設(shè)置為在后端服務(wù)器上處理文件上傳的 servlet 文件。下面的實(shí)例使用了 uploadservlet servlet 來上傳文件。
- 上傳單個(gè)文件,您應(yīng)該使用單個(gè)帶有屬性 type="file" 的 <input .../> 標(biāo)簽。為了允許多個(gè)文件上傳,請(qǐng)包含多個(gè) name 屬性值不同的 input 標(biāo)簽。輸入標(biāo)簽具有不同的名稱屬性的值。瀏覽器會(huì)為每個(gè) input 標(biāo)簽關(guān)聯(lián)一個(gè)瀏覽按鈕。
upload.jsp 文件代碼如下:
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>文件上傳實(shí)例 - 碩編程</title> </head> <body> <h1>文件上傳實(shí)例 - 碩編程</h1> <form method="post" action="/tomcattest/uploadservlet" enctype="multipart/form-data"> 選擇一個(gè)文件: <input type="file" name="uploadfile" /> <br/><br/> <input type="submit" value="上傳" /> </form> </body> </html>
編寫后臺(tái) servlet
以下是 uploadservlet 的源代碼,同于處理文件上傳,在這之前我們先確保依賴包已經(jīng)引入到項(xiàng)目的 web-inf/lib 目錄下:
- 下面的實(shí)例依賴于 fileupload,所以一定要確保在您的 classpath 中有最新版本的 commons-fileupload.x.x.jar 文件??梢詮?http://commons.apache.org/proper/commons-fileupload/ 下載。
- fileupload 依賴于 commons io,所以一定要確保在您的 classpath 中有最新版本的 commons-io-x.x.jar 文件??梢詮?http://commons.apache.org/proper/commons-io/ 下載。
你可以直接下載本站提供的兩個(gè)依賴包:
uploadservlet 的源代碼 如下所示:
package com.yapf.test; import java.io.file; import java.io.ioexception; import java.io.printwriter; 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.disk.diskfileitemfactory; import org.apache.commons.fileupload.servlet.servletfileupload; /** * servlet implementation class uploadservlet */ // 如果不配置 web.xml ,可以使用下面的代碼 // @webservlet("/uploadservlet") public class uploadservlet extends httpservlet { private static final long serialversionuid = 1l; // 上傳文件存儲(chǔ)目錄 private static final string upload_directory = "upload"; // 上傳配置 private static final int memory_threshold = 1024 * 1024 * 3; // 3mb private static final int max_file_size = 1024 * 1024 * 40; // 40mb private static final int max_request_size = 1024 * 1024 * 50; // 50mb /** * 上傳數(shù)據(jù)及保存文件 */ protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // 檢測(cè)是否為多媒體上傳 if (!servletfileupload.ismultipartcontent(request)) { // 如果不是則停止 printwriter writer = response.getwriter(); writer.println("error: 表單必須包含 enctype=multipart/form-data"); writer.flush(); return; } // 配置上傳參數(shù) diskfileitemfactory factory = new diskfileitemfactory(); // 設(shè)置內(nèi)存臨界值 - 超過后將產(chǎn)生臨時(shí)文件并存儲(chǔ)于臨時(shí)目錄中 factory.setsizethreshold(memory_threshold); // 設(shè)置臨時(shí)存儲(chǔ)目錄 factory.setrepository(new file(system.getproperty("java.io.tmpdir"))); servletfileupload upload = new servletfileupload(factory); // 設(shè)置最大文件上傳值 upload.setfilesizemax(max_file_size); // 設(shè)置最大請(qǐng)求值 (包含文件和表單數(shù)據(jù)) upload.setsizemax(max_request_size); // 中文處理 upload.setheaderencoding("utf-8"); // 構(gòu)造臨時(shí)路徑來存儲(chǔ)上傳的文件 // 這個(gè)路徑相對(duì)當(dāng)前應(yīng)用的目錄 string uploadpath = getservletcontext().getrealpath("/") + file.separator + upload_directory; // 如果目錄不存在則創(chuàng)建 file uploaddir = new file(uploadpath); if (!uploaddir.exists()) { uploaddir.mkdir(); } try { // 解析請(qǐng)求的內(nèi)容提取文件數(shù)據(jù) @suppresswarnings("unchecked") list<fileitem> formitems = upload.parserequest(request); if (formitems != null && formitems.size() > 0) { // 迭代表單數(shù)據(jù) for (fileitem item : formitems) { // 處理不在表單中的字段 if (!item.isformfield()) { string filename = new file(item.getname()).getname(); string filepath = uploadpath + file.separator + filename; file storefile = new file(filepath); // 在控制臺(tái)輸出文件的上傳路徑 system.out.println(filepath); // 保存文件到硬盤 item.write(storefile); request.setattribute("message", "文件上傳成功!"); } } } } catch (exception ex) { request.setattribute("message", "錯(cuò)誤信息: " + ex.getmessage()); } // 跳轉(zhuǎn)到 message.jsp getservletcontext().getrequestdispatcher("/message.jsp").forward( request, response); } }
message.jsp 文件代碼如下:
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>文件上傳結(jié)果</title> </head> <body> <center> <h2>${message}</h2> </center> </body> </html>
編譯和運(yùn)行 servlet
編譯上面的 servlet uploadservlet,并在 web.xml 文件中創(chuàng)建所需的條目,如下所示:
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="webapp_id" version="2.5"> <servlet> <display-name>uploadservlet</display-name> <servlet-name>uploadservlet</servlet-name> <servlet-class>com.yapf.test.uploadservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>uploadservlet</servlet-name> <url-pattern>/tomcattest/uploadservlet</url-pattern> </servlet-mapping> </web-app>
現(xiàn)在嘗試使用您在上面創(chuàng)建的 html 表單來上傳文件。當(dāng)您在瀏覽器中訪問:http://localhost:8080/tomcattest/upload.jsp ,演示如下所示: