.JavaWeb文件上傳和FileUpload組件使用


.JavaWeb文件上傳

1.自定義上傳

文件上傳時的表單設計要符合文件提交的方式:
1.提交方式:post
2.表單中有文件上傳的表單項:<input type="file"/>
3.指定表單類型:文件上傳類型: enctype=“multipart/form-data”`
jsp上傳頁面:

<%--
  Created by IntelliJ IDEA.
  User: cenyu
  Date: 16-12-20
  Time: 下午8:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>文件上傳</title>
  </head>
  <body>
  <form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
      用戶名:<input type="text" name="username">
      文件:<input type="file" name="file1"><br/>
      <input type="submit" value="提交上傳">
  </form>
  </body>
</html>

Servlet處理程序:

package test;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 手動處理文件上傳
 * Created by cenyu on 16-12-20.
 */
@WebServlet("/upload")
public class uploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
        request.getQueryString();//獲取GET:username=Tom&pwd=888
        request.getInputStream();//獲取POST:inputStream
        request.getParameter("");//使用這個可以不區分get和post
     */
        //獲取表單(POST)數據
        ServletInputStream in = request.getInputStream();//此方法得到所有的提交信息,不僅僅只有內容
        //轉換流
        InputStreamReader inReaser = new InputStreamReader(in);
        //緩沖流
        BufferedReader reader = new BufferedReader(inReaser);
        String str = null;
        while ((str=reader.readLine()) != null){
            System.out.println(str);
        }


    }
}

提交測試文件:

aaaaaaaaa
bbbbbbbbb
ccccccccc
dddddddd

運行結果:

-----------------------------468783950766433362585077246
Content-Disposition: form-data; name="username"

cenyu
-----------------------------468783950766433362585077246
Content-Disposition: form-data; name="file1"; filename="test.txt"
Content-Type: text/plain

aaaaaaaaa
bbbbbbbbb
ccccccccc
dddddddd
-----------------------------468783950766433362585077246--

2.FileUpload組件

FileUpload組件,也叫文件上傳組件,是Apache提供的開源項目
組件使用方法:
1.下載,引入jar文件

引入commons-fileupload-1.2.1.jar
引入依賴包commons-io-1.4.jar

3.Api學習

文件上傳組件API
FileItemFactory 文件上傳工廠類(把每一個請求表單項封裝為一個個FileItem對象)

fac.setRepository(repository);設置上傳臨時目錄

ServletFileUpload 文件上傳核心類,可以獲取所有的FileItem對象

list pload.parseRequest(request);
Boolean isMultipartContent(request);判斷表單類型,文件上傳表單但會true
upload.setFileSizeMax(fileSizeMax);設置單個上傳文件的最大值
upload.setSizeMax(sizeMax);設置總上傳文件大總的最大值
upload.setHeaderEcoding("UTF-8");設置上傳文件名的編碼

FileItem 封裝了普通表單項的值以及文件上傳表單元素的值

item.getFiledName();獲取上傳表單元素的名稱
item.getString();獲取上傳數據;
item.getString("UTF-8");獲取上傳數據,處理中文
item.getContentType();獲取上傳文件類型[文件上傳項]
item.getInputStream();獲取文件流[文件上傳項]
item.getName();獲取文件名[文件上傳項]
item.write(file);把數據寫到file文件
item.delete();刪除臨時文件

使用FileUpload組件來寫上傳方法的整體代碼:
需求:
1.設置單個文件不能超過30M
2.設置總大小不能超過50M
3.上傳目錄,上傳到項目資源目錄下的upload目錄
4.上傳文件不能覆蓋,解決上傳文件名的同名問題

前端jsp頁面中的代碼沒有改變,只需要看FileUploadServlet中的代碼:

package Upload;

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 javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.attribute.FileTime;
import java.util.List;
import java.util.UUID;

/**
 * 文件上傳組件完整使用
 * Created by cenyu on 16-12-20.
 */
@WebServlet("/load")
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.創建文件上傳工廠類
        DiskFileItemFactory fac = new DiskFileItemFactory();
        //2.創建文件上傳核心類對象
        ServletFileUpload upload = new ServletFileUpload(fac);
        //【一、設置單個文件最大30M】
        upload.setFileSizeMax(30*1024*1024);//30M
        //【二、設置總文件大小:50M】
        upload.setSizeMax(50*1024*1024); //50M

        //判斷,當前表單是否為文件上傳表單
        if (upload.isMultipartContent(request)){

            try {
                //3.把請求數據轉換為FileItem對象的集合
                List<FileItem> list = upload.parseRequest(request);
                //遍歷,得到每一個上傳項
                for (FileItem item : list){
                    //判斷:是普通表單項,還是文件上傳表單項
                    if (item.isFormField()){
                        //普通表單x
                        String fieldName = item.getFieldName();//獲取元素名稱
                        String value = item.getString("UTF-8"); //獲取元素值
                        System.out.println(fieldName+" : "+value);

                    }else {
                        //文件上傳表單

                        String name = item.getName(); //上傳的文件名稱
                        /**
                         * 【四、文件重名】
                         * 對於不同的用戶的test.txt文件,不希望覆蓋,
                         * 后台處理:給用戶添加一個唯一標記!
                         */
                        //a.隨機生成一個唯一標記
                        String id = UUID.randomUUID().toString();
                        //與文件名拼接
                        name = id + name;


                        //【三、上傳到指定目錄:獲取上傳目錄路徑】
                        String realPath = getServletContext().getRealPath("/upload");
                        //創建文件對象
                        File file = new File(realPath, name);
                        item.write(file);
                        item.delete();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else {
            System.out.println("不處理!");
        }

    }
}


免責聲明!

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



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