本次文件依靠第三方組件(Apache)進行實現
commons-fileupload組件:
commons-fileupload.jar
jar包下載地址: http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi 操作指南: http://commons.apache.org/proper/commons-fileupload/using.html
commons-io.jar
jar包下載地址: http://commons.apache.org/proper/commons-io/download_io.cgi 操作指南: http://commons.apache.org/proper/commons-io/description.html
1.form表單的method必須是post
2.form表單的組件得是file屬性:比如:<input type="file" name="photoName" >
3.form表單的enctype必須是multipart/form-data
以二進制字節流進行提交 傳統接收參數的方式無效
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE> <html> <head> <title>MrYang Design File Upload</title> </head> <body> <form action="${pageContext.request.contextPath}/servlet/UploadServlet" enctype="multipart/form-data" method="post" > 名稱<input type="text" name="name" ><br/><br/> 密碼<input type="text" name="pwd" ><br/><br/> <input type="file" name="photoName" ><br/><br/> <input type="submit" value="上傳" > </form> </body> </html>
2.servlet中進行接受並且進行上傳處理
package cn.javabs.web.controller; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import javax.servlet.ServletException; 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.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FilenameUtils; public class UploadServlet extends HttpServlet { @SuppressWarnings("unchecked") public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * Set CharEncoding */ response.setContentType("text/html ;charset = utf-8 "); response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); String name = request.getParameter("photoName"); // 1. 用於判斷jsp表單中的enctype 的屬性值是不是multipart/form-data boolean isMultipart = ServletFileUpload.isMultipartContent(request); // 如果不是multipart/form-data 則提醒 if (!isMultipart) { response.getWriter().write("提交的不是multipart/form-data"); return; } //實例化 磁盤文件項工廠對象 DiskFileItemFactory factory = new DiskFileItemFactory(); //ServletFileUpload是用於解析request對象 ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = null; try { // 通過ServletFileUpload得到所有上傳項.每一個FileItem就相當於一個上傳項 items = upload.parseRequest(request); } catch (FileUploadException e) { throw new RuntimeException(e); } System.out.println("我們來一起看一下items是:" + items); // 循環取出所有的組件 其中組件包含有 普通組件 和 上傳組件 for (FileItem item : items) { // 通過判斷確定 item中的普通組件 使用的判斷方法是isFormField // 是普通的表單字段 if(item.isFormField()){ System.out.println("這是普通的表單字段"); // 獲取表單中的屬性 String fieldName = item.getFieldName(); // 獲取表單中的屬性所對應的值 String fieldValue = item.getString(); System.out.println(fieldName +":" + fieldValue); } // 是上傳的表單字段 else{ System.out.println("這是上傳的表單字段"); // 獲取字節輸入流 InputStream in = item.getInputStream(); // 獲取上傳文件的名稱 String uploadName = item.getName(); // 判斷上傳文件的名稱是否為null,如果不為空 if(uploadName != null){ // 文件名稱 = 獲取文件名稱,並且包含后綴 uploadName = FilenameUtils.getName(uploadName); } // 文件存放的真實路徑 其實files文件夾 存放在Tomcat服務器的項目里面 String filePath = getServletContext().getRealPath("/files"); // 根據真實的路徑 進行實例化創建目錄 File file = new File(filePath); // 如果目錄不存在 if(!file.exists()){ //創建多級目錄 file.mkdirs(); } // 根據 真實目錄 + "\" + 文件名稱 [file.separator 的結果是 "\"] OutputStream out = new FileOutputStream(filePath + file.separator + uploadName ); // 定義長度 初始化值為0 int len = 0; //定義字節緩沖區數組 byte [] b = new byte[1024]; // 循環 while ((len = in.read(b))!=-1) { out.write(b, 0, len); } // 關閉輸出流 out.close(); // 關閉輸入流 in.close(); // 刪除臨時文件 item.delete(); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
別忘了還有web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>cn.javabs.web.controller.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/servlet/UploadServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>