文件上傳的方式有哪些?

上回咱們說了下文件下載的方式有哪些,此次咱們從不一樣的環境下簡單來講說文件上傳的方式有哪些。html

文件上傳的方式
Servlet2.5 方式
Servlet3.0 方式
SpringMVC 方式
案例實操
Servlet2.5 方式
文件上傳涉及到前臺頁面的編寫和後臺服務器端代碼的編寫,前臺發送文件,後臺接收並保存文件,這纔是一個完整的文件上傳。





java

1) 前臺頁面web

在作文件上傳的時候,會有一個上傳文件的界面,首先咱們須要一個表單,而且表單的請求方式爲 POST;其次咱們的 form 表單的 enctype 必須設爲」multipart/form-data」即 enctype=「multipart/form-data」 意思是設置表單的 MIME 編碼。默認狀況下這個編碼格式是 」application/x-www-form-urlencoded」,不能用於文件上傳;只有使用了 multipart/form-data 才能完整地傳遞文件數據。spring

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>上傳文件</title>
</head>
<body>
<form action="uploadServlet" method="post" enctype="multipart/form-data">
文件:<input type="file" name="myfile"/>
<input type="submit" value="上傳" />
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
想要獲取更多Java相關的學習資料,加微信:lezijie007 暗號:999 你須要的統統有哦

























apache

2) 後臺 commons-fileupload 的使用瀏覽器

首先須要導入第三方jar包,http://commons.apache.org/ 下載 commons-io 和 commons-fileupload 兩個jar的資源。解壓並導入到項目中。commons-fileupload.jar 是文件上傳的核心包 commons-io.jar 是 fileupload 的依賴包,同時又是一個工具包。tomcat

介紹一下使用到的幾個核心類服務器

  DiskFileItemFactory – 設置磁盤空間,保存臨時文件。只是一個工具類微信

  ServletFileUpload – 文件上傳的核心類,此類接收 request,並解析app

  ServletFileUpload.parseRequest(request); – List 解析 request

  一、建立一個 DiskFileItemFactory 工廠類,並制定臨時文件和大小

  二、建立 ServletFileUpload 核心類,接收臨時文件,作請求的轉換

  三、經過 ServletFileUpload 類轉換原始請求,獲得 FileItem 集合

  四、遍歷集合中的各個元素並處理

  五、判斷每一個元素是不是普通表單項,若是是則按照普通表單項處理

  六、若是不是普通表單項,則是文件,經過處理的方式進行處理(上傳)

public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 設定編碼,能夠獲取中文文件名
    request.setCharacterEncoding("UTF-8");
    // 獲取tomcat下的upload目錄的路徑
    String path = getServletContext().getRealPath("/upload");
    // 臨時文件目錄
    String tempPath = getServletContext().getRealPath("/temp");
    // 檢查咱們是否有文件上傳請求
    // boolean isMultipart = ServletFileUpload.isMultipartContent(req);
    // 一、聲明DiskFileItemFactory工廠類,用於在指定磁盤上設置一個臨時目錄
    DiskFileItemFactory disk = new DiskFileItemFactory(1024 * 10, new File(tempPath));
    // 二、聲明ServletFileUpload,接收上面的臨時文件。也能夠默認值
    ServletFileUpload up = new ServletFileUpload(disk);
    // 三、解析request
    try {
        List<FileItem> list = up.parseRequest(request);
        if (list.size() > 0) {
            for (FileItem file : list) {
                // 判斷是不是普通的表單項
                if (file.isFormField()) {
                    String fieldName = file.getFieldName();
                    // 中文亂碼,此時還須要指定獲取數據的編碼方式
                    // String value = file.getString();
                    String value = file.getString("UTF-8");
                    System.out.println(fieldName + "=" + value);
                } else { // 說明是一個文件
                    // 獲取文件自己的名稱
                    String fileName = file.getName();
                    System.out.println(file.getFieldName());
                    // 處理文件名稱
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                    System.out.println("old Name : " + fileName);
                    // 修更名稱
                    String extName = fileName.substring(fileName.lastIndexOf("."));
                    String newName = UUID.randomUUID().toString().replace("-", "") + extName;
                    // 保存新的名稱,並寫出到新文件中
                    file.write(new File(path + "/" + newName));
                    System.out.println("文件名是:" + fileName);
                    System.out.println("文件大小是:" + file.getSize());
                    file.delete();
                }
            }
        }
    } catch (FileUploadException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Servlet3.0 方式
使用註解 @MultipartConfig 將一個 Servlet 標識爲支持文件上傳。Servlet3.0 將 multipart/form-data 的 POST 請求封裝成 Part,經過 Part 對上傳的文件進行操做。























































前臺

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>上傳文件</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="uname"/>
文件:<input type="file" name="myfile"/>
<input type="submit" value="上傳" />
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
後臺



























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

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("上傳文件...");
    // 設置編碼
    request.setCharacterEncoding("UTF-8");
    // 獲取普通表單項參數
    String uname = request.getParameter("uname");
    System.out.println(uname);
    // 上傳文件
    // 獲得part對象 request.getpart(name):name表明的是表單中file元素的name屬性值
    Part part = request.getPart("myfile");
    // 獲得文件存放的路徑
    String path = request.getServletContext().getRealPath("/");
    // 獲得文件名
    String fileName = part.getSubmittedFileName();
    // 上傳
    part.write(path + fileName);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SpringMVC 方式
Pom 文件修改 添加 commons-fileupload 依賴

























<dependency>

<groupId>commons-fileupload</groupId> 

<artifactId>commons-fileupload</artifactId> 

<version>1.3.2</version>

</dependency>
1
2
3
4
5
6
7
8
9
servlet-context.xml









<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<property name="maxUploadSize"> 

<value>104857600</value> 

</property> 

<property name="maxInMemorySize"> 

<value>4096</value> 

</property>

</bean>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FileController















import java.io.File;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

import org.springframework.web.servlet.ModelAndView;

@Controller

public class FileController {

@RequestMapping("/uploadFile") 

public ModelAndView uploadFile(HttpServletRequest request){ 

    ModelAndView mv=new ModelAndView(); 

    mv.setViewName("result"); 

    MultipartHttpServletRequest mr=(MultipartHttpServletRequest) request; 

    MultipartFile multipartFile= mr.getFile("file"); 

    String path=request.getSession().getServletContext().getRealPath("upload"); 

    System.out.println(path); 

    if(null!=multipartFile&&!multipartFile.isEmpty()){ 

        String fileName=multipartFile.getOriginalFilename(); 

    try { 

        multipartFile.transferTo(new File(path,fileName)); 

        mv.addObject("msg", "文件上傳成功!"); 

    } catch (Exception e) { 

        mv.addObject("msg", "上傳失敗!"); 

        e.printStackTrace(); 

    } 

    } 

    return mv; 

}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
前臺表單





























































<form action="uploadFile" method="post" enctype="multipart/form-data">

<input type="file" name="file"/> 

<button type="submit"> 提交</button>

</form>
1
2
3
4
5
6
7
擴展~MIME
MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型。是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。








它是一個互聯網標準,擴展了電子郵件標準,使其可以支持:

非ASCII字符文本;非文本格式附件(二進制、聲音、圖像等);由多部分(multiple parts)組成的消息體;包含非ASCII字符的頭信息(Header information)。

這個標準被定義在RFC 204五、RFC 204六、RFC 204七、RFC 204八、RFC 2049等RFC中。 MIME改善了由RFC 822轉變而來的RFC 2822,這些舊標準規定電子郵件標準並不容許在郵件消息中使用7位ASCII字符集之外的字符。正因如此,一些非英語字符消息和二進制文件,圖像,聲音等非文字消息本來都不能在電子郵件中傳輸(MIME能夠)。MIME規定了用於表示各類各樣的數據類型的符號化方法。 此外,在萬維網中使用的HTTP協議中也使用了MIME的框架,標準被擴展爲互聯網媒體類型。

查看不一樣文件對應的 MIME 類型,推薦你們一種方式,以 Tomcat爲例,它下面的 web.xml 文件能夠查看全部的MIME類型,經過 Ctrl + F 搜索快速找到你想知道的文件對應的 MIME 類型。

相關文章
相關標籤/搜索