1. 程式人生 > >Servlet筆記2-文件上傳

Servlet筆記2-文件上傳

val 指定 author 文件上傳 create tell url編碼 utf for

Servlet上傳文件:
  Servlet 3.0改進了部分API,其中HttpServletRequest增加了對文件上傳的支持。

  HttpServletRequest提供了兩個方法來處理文件上傳:
    1.Part getPart(String name):根據名稱來獲取文件上傳域

    2.Collection<Part> getParts():獲取所有的文件上傳域

  上面兩個方法的返回值都涉及一個API:Part,每個Part對象對應於一個文件上傳域,該對象提供了很多方法來範文上傳文件的文件類型、大小、輸入流等,並提供了一個write(String file)方法將上傳文件寫入服務器磁盤



  向服務器上傳文件,表單裏要使用<input type="file" .../>,並且,上傳文件一定要為表單域設置enctype屬性。
表單的enctype屬性指的是表單數據的編碼方式,該屬性有三個值:
  1.application/x-www-form-urlencoded:默認的編碼方式,只處理表單域裏的value屬性值,采用這種編碼方式的表單會將表單域的值處理成URL編碼方式

  2.multipart/form-data:這種編碼方式會以二進制流的方式來處理表單數據,這種編碼方式會把文件域指定文件的內容也封裝到請求參數裏

  3.text/plain:這種編碼方式當表單的action屬性為mailto:URL的形式時比較方便,這種方式主要適用於直接通過表單發送郵件的方式



  文件上傳示例:

  頁面jsp:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/1/4
  Time: 16:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Servlet文件上傳</title>
</head>
<body>

    <form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
        普通參數:
<input type="text" name="inputText" ><br> 選擇文件:<input type="file" name="file" ><br> <input type="submit" value="上傳"> </form> </body> </html>

  Servlet程序:

/**
 * Description:servlet
 * Author: Eleven
 * Date: 2018/1/13 16:23
 */
@WebServlet(name="upload",urlPatterns = "/upload")
@MultipartConfig  //處理文件上傳的Servlet,必須要加此註解
public class UploadServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解決接收參數為中文亂碼的問題
        request.setCharacterEncoding("UTF-8");
        //解決向頁面輸出內容為亂碼,即使用out.println()的時候
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        //獲取普通請求參數
        String inputText = request.getParameter("inputText");
        System.out.println("普通的參數為:"+inputText);
        //獲取文件上傳域
        Part part = request.getPart("file");
        //文件的上傳類型
        System.out.println("文件的上傳類型:"+part.getContentType());
        //文件上傳的大小
        System.out.println("上傳文件的大小:"+part.getSize());
        //文件上傳域的Header Name
        Collection<String> headerNames = part.getHeaderNames();
        //遍歷文件上傳域的Header Name Value
        for(String headerName:headerNames){
            System.out.println(headerName+"---->"+part.getHeader(headerName));

        }

        //獲取包含原始文件名的字符串
        String fileNameInfo = part.getHeader("content-disposition");
        //提取上傳文件的文件名
        String fileName = fileNameInfo.substring(fileNameInfo.indexOf("filename=\"")+10,fileNameInfo.length()-1);
        //將文件寫入服務器磁盤  保存在web應用根路徑下的upload文件下
        part.write(getServletContext().getRealPath("upload")+"/"+fileName);

        out.println("文件上傳成功!");
    }

}

  

  對於傳統的文件上傳需要借助common-fileupload等工具,處理起來有點復雜,借助Servlet 3.0的API,處理文件就變得比較簡單了。

Servlet筆記2-文件上傳