JSP可以透過HTML的form表單上傳檔案到伺服器。 文件類型可以是文字檔、二進位、圖像檔等其他任何文件。
接下來我們使用HTML標籤來建立檔案上傳表單,以下為要注意的點:
form表單method屬性必須設定為POST方法,不能使用GET 方法。
form表單enctype屬性需要設定為multipart/form-data。
form表單action屬性需要設定為提交到後台處理文件上傳的jsp檔案位址。例如uploadFile.jsp程式檔案用來處理上傳的檔案。
上傳檔案元素需要使用<input .../> 標籤,屬性設定為type="file"。如果需要上傳多個文件,可以在<input .../>標籤中設定不同的名稱。
以下是一個上傳檔案的表單,實例如下:
<html><head><title>File Uploading Form</title></head><body><h3>File Upload:</h3>Select a file to upload: <br /><form action="UploadServlet" method="post" enctype="multipart/form-data"><input type="file" name="file" size="50" /><br /><input type="submit" value="Upload File" /></form></body></html>在你本機瀏覽器存取該文件,顯示介面如下所示,在你點擊"Upload File"會彈出一個視窗讓你選擇要上傳的文件:
首先我們先定義檔案上傳後儲存在服務上的位置,你可以將路徑寫在你的程式當中,或者我們可以在web.xml設定檔中透過設定context-param 元素來設定檔案儲存的目錄,如下所示:
<web-app>....<context-param> <description>檔案上傳位址</description> <param-name>file-upload</param-name> <param-value> c:apache-tomcat- 5.5.29webappsdata </param-value> </context-param>....</web-app>
以下腳本文件UploadFile.jsp可以處理多個上傳的文件,在使用該腳本前,我們需要注意以下幾點:
以下實例依賴FileUpload, 所以你需要在你的classpath中引入最新的commons-fileupload.xxjar套件檔案。 下載網址為:http://commons.apache.org/fileupload/。
FileUpload 依賴Commons IO, 所以你需要在你的classpath引進最新的commons-io-xxjar 。 下載網址為:http://commons.apache.org/io/。
在測試下列實例時,你需要上傳確認上傳的檔案大小小於maxFileSize變數設定的大小,否則檔案無法上傳成功。
確保你已經建立了目錄c:temp 和c:apache-tomcat-5.5.29webappsdata 。
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %><%@ page import="javax.servlet.http.*" %><%@ page import= "org.apache.commons.fileupload.*" %><%@ page import="org.apache.commons.fileupload.disk.*" %><%@ page import="org.apache.commons.fileupload.servlet.*" %><%@ page import="org.apache.commons.io.output.*" %><% File file ; int maxFileSize = 5000 * 1024 ; int maxMemSize = 5000 * 1024; ServletContext context = pageContext.getServletContext(); String filePath = context.getInitParameter("file-upload"); // 驗證上傳內容了類型String contentType = request.getContentType(); if ((contentType.indexOf("multipart/form-data" ) >= 0)) { DiskFileItemFactory factory = new DiskFileItemFactory(); //設定記憶體中儲存檔案的最大值factory.setSizeThreshold(maxMemSize); // 本地儲存的資料大於maxMemSize. factory.setRepository(new File("c:\temp")); // 建立新的檔案上傳處理程式ServletFileUpload upload = new ServletFileUpload(factory); // 設定最大上傳的檔案大小upload.setSizeMax( maxFileSize ); try{ // 解析取得的檔案List fileItems = upload.parseRequest(request); // 處理上傳的檔案Iterator i = fileItems.iterator(); out.println("<html>"); out.println( "<head>"); out.println("<title>JSP File upload</title>"); out.println("</head>"); out.println("<body>"); while ( i.hasNext () ) { FileItem fi = (FileItem)i.next(); if ( !fi.isFormField () ) { // 取得上傳檔案的參數String fieldName = fi.getFieldName(); String fileName = fi.getName(); boolean isInMemory = fi.isInMemory();長 sizeInBytes = fi.getSize(); // 寫入檔案if( fileName.lastIndexOf("\") >= 0 ){ file = new File( filePath , fileName.substring( fileName.lastIndexOf("\") )) ; }else{ file = new File( filePath , fileName.substring(fileName.lastIndexOf("\")+1)) ; } fi.write( file ) ; out.println("Uploaded Filename: " + filePath + fileName + "<br>"); } } out .println("</body>"); out.println("</html>"); }catch(Exception ex) { System.out.println(ex); } }else{ out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>" ); out.println("</head>"); out.println("<body>"); out.println("<p>No file uploaded</p>"); out.println("</body>"); out.println("</html>"); }%>
接下來讓我們透過瀏覽器存取http://localhost:8080/UploadFile.htm ,介面如下所示,並上傳檔案:
如果你的JSP腳本運作正常,檔案會被上傳至c:apache-tomcat-5.5.29webappsdata ,你可以開啟資料夾看看是否上傳成功。