java 文件上傳

file上傳需要依賴的jar包:commons-fileupload
maven添加

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>

(用於解析2進制數據)

文件上傳需要使用的三個類

類DiskFileItemFactory
將表單數據封裝,存在一個臨界值,當上傳的文件小於這個值時,文件被直接存放在內存中,當文件大於這個值會被存放在臨

時文件夾中,可以通過System.getProperty(“java.io.tmpdir”)獲取臨時文件夾地址

構造方法
1、public DiskFileItemFactory()
採用默認的臨界值和默認的臨時文件夾夠着對象
2、DiskFileItemFactory(int sizeThreshold,File repository)
採用自定義臨界值和系統臨時文件夾夠着對象
3、FileItem createItem()
不需要自己調用,組件會自己調用

類ServletFileUpload(處理文件類)
構造方法
1、public ServletFileUpload()
直白點這個無參構造函數沒有什麼用
2、 public ServletFileUpload(FileItemFactory fileItemFactory)
構造以filefactory的實例

常用方法
1、setSizeMax(long sizeMax)/getSizeMax
設置獲取請求文件的大小,以防止客戶端惡意上傳文件
2、setFileSizeMax
設置單個文件上傳的大小
3、 public List parseRequest(javax.servlet.http.HttpServletRequest req)
將http請求消息解析,將form表單的每個input分裝成單獨的fileitem對象,然後將其加入到
list集合中
4、public FileItemIterator getItemIterator(HttpServletRequest request)
與3方法相同,返回的是迭代器
5、public stiatc boolean isMultipartContent(HttpServletRequest req)
靜態方法,判斷請求方式是否是“multipart/form-data”類型
6、public void setHeaderEncoding()
設置請求文本中的字符編碼

類FileItem
常用方法
1、boolean isFormField()。isFormField方法用來判斷FileItem對象裏面封裝的數據是一個普通文本表單字段,還是一個文

件表單字段。如果是普通文本表單字段,返回一個true否則返回一個false。因此可以用該方法判斷是否是普通表單域還是文件

上傳表單域。
2、String getName()。getName方法用來獲得文件上傳字段中的文件名。
3、String getFieldName()。getFieldName方法用來返回表單標籤的name屬性的值。
4、void write(File file)。write方法將FileItem對象中的內容保存到某個指定的文件中。如果FileItem對象中的內容是保存

在某個臨時文件中,該方法完成後,臨時文件可以會被刪除。該方法也可以將普通表單字段保存在一個文件中,但最主要的用

途是把上傳的文件內容保存在本地文件系統中。
5、String getString()。getString()方法將FileItem對象中保存的數據流內容以一個字符串返回。它有兩個重載形式。

public java.lang.String getString()和public java.lang.String getString(java.lang.String encodeing) throws

java.io.UnsupportedEncodingException。前者使用缺省的字符集編碼將主體內容轉換成字符串,後者使用參數指定的字符集

編碼。如果在讀取普通表單字段元素的內容時,出現了亂碼現象,可以調用第二個方法,並傳入 正確的字符集編碼名稱。
6、String getContentType()。此方法用來獲得上傳文件的類型,即標段字段元素描述頭屬性“content-type”的值,如

image/jpeg。如果FileItem對象對應的是普通的表單字段,將返回null。
7、boolean isInMemory()。判斷FileItem對象封裝的數據是保存在內存中還是硬盤中。
8、void delete()。此方法用來清空FileItem對象中封裝的主體內容,如果內容是被保存在臨時文件中,該方法會把臨時文

件刪除。
9、InputStream getInputStream()。以流的形式返回上傳文件的主體內容。
10、long getSize()。返回上傳文件的大小。

demo

客戶端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="pragma" content="no-cache" />
    <base target="_self">
    <title>文件上傳</title>
</head>
<body>
<!--注意enctype屬性-->
<form method="post" action="/user/addHeadImg" enctype="multipart/form-data">
    <input name = "img" type ="file" class ="text1" size ="40" maxlength="40" onchange="uploadfile(this)">
    <span id="UPtip" style="color:red;font-size:1.5rem"></span>
    <input type="submit" value="確定">
</form>
</body>
</html>

服務端

package cn.saleNc.controller;


import javax.json.Json;
import javax.servlet.http.HttpServletRequest;

import cn.saleNc.dao.UserDao;
import cn.saleNc.model.User;
import cn.saleNc.service.UserService;
import cn.saleNc.uitl.ResultData;
import com.fasterxml.jackson.databind.ObjectMapper;
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 org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

@Controller
@RequestMapping("/user")
public class UserController {
    private File file;

    private String filePath ;

    @RequestMapping("/addHeadImg")
    public String addHeadImg(HttpServletRequest req, HttpServletResponse resp){
        //判斷用戶是否登錄
        HttpSession session = req.getSession();
        User user = (User) session.getAttribute("user");

        //對照片在服務存儲位置進行獲取
        if (filePath == null){
            filePath = req.getSession().getServletContext().getRealPath("UploadUserHeadImg");
            File file = new File(filePath);
            if ( !file.exists()){
                file.mkdir();
            }
        }

        //判斷是否是multipart/form-data類型  提交方式
        if (ServletFileUpload.isMultipartContent(req)){

            //設置圖片上傳的緩衝區
            DiskFileItemFactory factory =new DiskFileItemFactory();
//            System.out.println(System.getProperty("java.io.tmpdir"));

            //設置文件上傳大小
            ServletFileUpload sfu = new ServletFileUpload(factory);
            sfu.setFileSizeMax(5 * 1024 * 1024);  //限制大小爲5mb
            sfu.setHeaderEncoding("utf-8");

            //獲取post請求裏面的元素
            try {
                List<FileItem> fileList = sfu.parseRequest(req);
                Iterator<FileItem> fileItemIterator = fileList.iterator();

                while (fileItemIterator.hasNext()){
                    FileItem fileItem = fileItemIterator.next();
                    //對普通表單元素進行獲取
                    if (fileItem.isFormField()){
                        //獲取鍵值對
                        String key = fileItem.getFieldName();
                        String value = fileItem.getName();
                        System.out.println("key值:"+ key +"對應的value值:" + value);
                    }else {
                        //對上傳文件進行處理
                        //對照片名字進行唯一處理
                        String uploadName = fileItem.getName();
                        String fileType = uploadName.substring(uploadName.indexOf("."));
                        String newName = new Date().getTime() + fileType;
                        System.out.println("newName:"+ newName);
                        System.out.println("filePath:"+ filePath);
                        //將文件寫入進服務器中
                        File file = new File(filePath+"/" + newName);
                        fileItem.write(file);
                        //刪除文件緩衝
                        fileItem.delete();

                        //存入數據庫(用戶name和頭像的圖片地址url)
                        if (user != null){

                        }

                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }



        return "views/result";
    }


}

注意
需要在maven添加依賴

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章