JSP 文件上傳
JSP可以使用HTML表單標簽被用於允許用戶將文件上傳到服務器。上傳的文件可以是文本文件或二進製文件或圖像文件或任何文件。
創建一個文件上傳表單:
下麵的下麵的HTM代碼創建了一個上傳表單。以下是要點要注意下:
-
該表單方法屬性應設置為POST方法,而GET方法無法使用。
-
表單enctype屬性應該設置為multipart/ form-data。
-
表單action屬性應該設置為一個JSP文件,該文件將處理文件的上傳在後台服務器。下麵的例子是使用uploadFile.jsp程序文件上傳文件。
-
要上傳一個文件,你應該使用一個單一的<input.../>標簽與屬性 type="file"。以允許多個文件上傳,包括一個以上的輸入變量作為名稱屬性的不同值。瀏覽器關聯到他們每個人的瀏覽按鈕。
<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",形式會隨著所選擇的文件提交:
File Upload: Select a file to upload:
注:以上表格僅僅是虛擬的形式和是行不通的,應該嘗試上麵的代碼在你的機器,使其工作。
寫作後端JSP的腳本:
首先讓我們定義在那裡上傳的文件將被存儲在一個位置。你可以硬編碼這在程序或目錄名也可以使用,例如在web.xml中的context-param元素的外部配置如下補充:
<web-app> .... <context-param> <description>Location to store uploaded file</description> <param-name>file-upload</param-name> <param-value> c:apache-tomcat-5.5.29webappsdata </param-value> </context-param> .... </web-app>
以下是源代碼UploadFile.jsp它可以同時處理多個文件上傳。繼續操作之前,已確認下列各項:
-
下麵的例子依賴於的FileUpload,所以一定要確保commons-fileupload.x.x.jar文件的最新版本在你的classpath中。你可以從這裡下載 http://commons.apache.org/fileupload/.
-
FileUpload依賴於共享IO,所以一定要確保你有commons-io-x.x.jar文件在你的類路徑中的最新版本。你可以從這裡下載 http://commons.apache.org/io/.
-
而下麵的例子測試,你應該上傳的文件應該小於maxFileSizeotherwise,否則文件將無法上傳。
-
請確保您已創建的目錄 c: emp 和 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"); // Verify the content type String contentType = request.getContentType(); if ((contentType.indexOf("multipart/form-data") >= 0)) { DiskFileItemFactory factory = new DiskFileItemFactory(); // maximum size that will be stored in memory factory.setSizeThreshold(maxMemSize); // Location to save data that is larger than maxMemSize. factory.setRepository(new File("c:\temp")); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // maximum file size to be uploaded. upload.setSizeMax( maxFileSize ); try{ // Parse the request to get file items. List fileItems = upload.parseRequest(request); // Process the uploaded file items 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 () ) { // Get the uploaded file parameters String fieldName = fi.getFieldName(); String fileName = fi.getName(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); // Write the file 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>"); } %>
現在試著用你上麵創建的HTML表單來上傳文件。當你想嘗試http://localhost:8080/UploadFile.html,它會顯示以下結果,這將有助於從本地計算機上傳文件。
File Upload: Select a file to upload:
如果JSP腳本能正常工作,文件應該上傳到 c:apache-tomcat-5.5.29webappsdata 目錄下.