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>