1. 程式人生 > >Servlet自學之旅(9):檔案上傳

Servlet自學之旅(9):檔案上傳

Servlet 檔案上傳

通過HTML的form標籤,Servlet可以讓我們將檔案上傳到伺服器,包括文字檔案,圖片等形式的文件。

建立上傳檔案的表單

首先要建立一個jsp檔案來上傳表單,表單的相關屬性需要符合以下幾點:

  • method屬性應設定為POST,不可使用GET
  • enctype屬性應設定為multipart/form-data.
  • action屬性應設定為在伺服器上負責處理檔案上傳的Servlet。
  • 上傳單個檔案 使用單個 < input type=”file”…./>標籤 ,多檔案上傳需要不同name的< input…/>,瀏覽器會為每個標籤關聯一個瀏覽按鈕。

uploade.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>檔案上傳</title> </head> <body> <h1>檔案上傳</h1> <form action="/UploadFile/UploadServlet" enctype="multipart/form-data"> 選擇上傳的: <input type="file" name="uploadOne"/> <input type="submit" value="Submit"/> </form> </body> </html>

建立接收檔案的Servlet

@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 接收後文件的儲存目錄
    private static final String UPLOAD_DIR = "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

    public UploadServlet() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 檢測是否是多媒體上傳
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 不是的話就return,不進行之後接收上傳檔案的操作
            return;
        }

        // 設定上傳相關的引數
        DiskFileItemFactory dItemFactory = new DiskFileItemFactory();
        dItemFactory.setSizeThreshold(MEMORY_THRESHOLD);

        // 設定臨時儲存目錄
         dItemFactory.setRepository(new File(System.getProperty("java.io.tmpdir")));
        ServletFileUpload upload = new ServletFileUpload(dItemFactory);
        upload.setFileSizeMax(MAX_FILE_SIZE);
        upload.setSizeMax(MAX_REQUEST_SIZE);
        upload.setHeaderEncoding("UTF-8");

         // String uploadPath = request.getServletContext().getRealPath("./") + UPLOAD_DIR;
        // this.getServletConfig().getServletContext().getRealPath("/");
        // request.getServletContext().getRealPath("/");
        //檔案存放的地址,上面註釋的地址是Eclipse中獲取的專案絕對地址:
     //G:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\專案名
        //這個地址太深,不便檢視,擷取.metadata前的地址,放在專案檔案的目錄下。
        //以下地址:G:\workspace\UpLoadFile\WebContent\upload
        String t = Thread.currentThread().getContextClassLoader().getResource("").getPath();
        int num = t.indexOf(".metadata");
        String uploadPath = t.substring(1, num).replace('/', '\\') + "UploadFile\\WebContent\\" + UPLOAD_DIR;
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }

        try {
            @SuppressWarnings("unchecked")
            Map<String, List<FileItem>> fileMap = upload.parseParameterMap(request);
            fileMap.entrySet();
            Iterator iterator = fileMap.entrySet().iterator();
            if (iterator.hasNext()) {
                Map.Entry entry = (Entry) iterator.next();
                List<FileItem> fileItems = (List<FileItem>) entry.getValue();
                for (FileItem item : fileItems) {
                     //對傳入的非 簡單的字串進行處理,即獲取非表單欄位的 ,比如說二進位制的 圖片,電影這些 
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String filePath = uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // 在控制檯輸出檔案的上傳路徑
                        System.out.println("上傳成功");
                        System.out.println(filePath);
                        // 儲存檔案到硬碟
                        item.write(storeFile);
                    }
                }
            }

        } catch (FileUploadException e) {
            System.out.println("上傳失敗");
            e.printStackTrace();
        } catch (Exception e) {
            System.out.println("上傳失敗");
            e.printStackTrace();
        }
    }
}