Servlet上傳文件詳細解析以及注意事項


准備階段,下載需要的包:

在Servlet中進行文件上傳需要用到外部的類庫,apache提供了這些類庫, 主要需要commons-fileupload.jarcommons-io.jar

下載的步驟如下:
進入www.apache.org網站, ——>在Projects下找到commons,點擊進入——>找到Components下的FileUpload,點擊進入就可以找到下載

頁面如下:

可以看到這里有開發指南和下載地址,如果要詳細學習,慢慢看這里的資源就可以了。

 

commons-io.jar包的下載地址:http://commons.apache.org/fileupload/dependencies.html

把兩個jar包放到WEB-INF的lib目錄下。

 

開發階段:

上傳頁面:index.jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>文件上傳</title>
13     <meta http-equiv="pragma" content="no-cache">
14     <meta http-equiv="cache-control" content="no-cache">
15     <meta http-equiv="expires" content="0">    
16     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
17     <meta http-equiv="description" content="This is my page">
18     <!--
19     <link rel="stylesheet" type="text/css" href="styles.css">
20     -->
21   </head>
22   
23   <body>
24        <form action="upload" method="post" enctype="multipart/form-data">
25            文件別名:<input type="text" name="filename"><br>
26            選擇文件:<input type="file" name="fileupload"><br>
27            <input type="submit" value="提交">
28        
29        </form>
30   </body>
31 </html>

 

 這里注意第24行,上傳文件時要指定提交方法method="post", 信息類型為enctype="multipart/form-data"

 

上傳功能servlet:FileUpload

 1 package com.sunflower.servlet;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.util.Iterator;
 6 import java.util.List;
 7 
 8 import javax.servlet.ServletException;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 
13 import org.apache.commons.fileupload.FileItem;
14 import org.apache.commons.fileupload.FileItemFactory;
15 import org.apache.commons.fileupload.FileUploadException;
16 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
17 import org.apache.commons.fileupload.servlet.ServletFileUpload;
18 
19 public class FileUpload extends HttpServlet {
20     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
21         req.setCharacterEncoding("UTF-8");
22         fileControl(req, resp);
23     }
24 
25     /**
26      * 上傳文件的處理
27      */
28     private void fileControl(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
29 
30         // 在解析請求之前先判斷請求類型是否為文件上傳類型
31         boolean isMultipart = ServletFileUpload.isMultipartContent(req);
32 
33         // 文件上傳處理工廠
34         FileItemFactory factory = new DiskFileItemFactory();
35 
36         // 創建文件上傳處理器
37         ServletFileUpload upload = new ServletFileUpload(factory);
38 
39         // 開始解析請求信息
40         List items = null;
41         try {
42             items = upload.parseRequest(req);
43         }
44         catch (FileUploadException e) {
45             e.printStackTrace();
46         }
47 
48         // 對所有請求信息進行判斷
49         Iterator iter = items.iterator();
50         while (iter.hasNext()) {
51             FileItem item = (FileItem) iter.next();
52             // 信息為普通的格式
53             if (item.isFormField()) {
54                 String fieldName = item.getFieldName();
55                 String value = item.getString();
56                 req.setAttribute(fieldName, value);
57             }
58             // 信息為文件格式
59             else {
60                 String fileName = item.getName();
61                 int index = fileName.lastIndexOf("\\");
62                 fileName = fileName.substring(index + 1);
63                 req.setAttribute("realFileName", fileName);
64 
65                 // 將文件寫入
66 //                String path = req.getContextPath();
67 //                String directory = "uploadFile";
68 //                String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/" + directory;
69                 String basePath = req.getRealPath("/uploadFile");
70                 File file = new File(basePath, fileName);
71                 try {
72                     item.write(file);
73                 }
74                 catch (Exception e) {
75                     e.printStackTrace();
76                 }
77             }
78         }
79 
80         try {
81             req.getRequestDispatcher("/uploadsuccess.jsp").forward(req, resp);
82         }
83         catch (IOException e) {
84             e.printStackTrace();
85         }
86     }
87 }

 

 這里要注意第66~68行,將文件上傳到Web項目的"uploadFile"文件夾中,如果用這種方法得到的路徑是"http://localhost:8080/upload/uploadFile", 而創建File類用的路徑是絕對路徑,這樣就會出問題,所以這里要用的是得到真實路徑的方法HttpServletRequest.getRealPath().

 

以上是最簡單的文件上傳,如果要加入上傳的限制可以在DiskFileItemFactory和ServletFileUpload中進行限制:

在34行后加入:

        //創建臨時文件目錄
        File tempFile = new File(req.getRealPath("/temp"));
        //設置緩存大小
        ((DiskFileItemFactory) factory).setSizeThreshold(1024*1024);
        //設置臨時文件存放地點
        ((DiskFileItemFactory) factory).setRepository(tempFile);

 

注意第72行的FileItem.write()方法,如果使用了這個方法寫入文件,那么臨時文件會被系統自動刪除.

在38行后加入:

        //將頁面請求傳遞信息最大值設置為50M
        upload.setSizeMax(1024*1024*50);
        //將單個上傳文件信息最大值設置為6M
        upload.setFileSizeMax(1024*1024*6);

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM