一、maven
<!-- 引入json處理包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.35</version>
</dependency>
<!--IO 文件流需要的包-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
二、application.yml
server:
port: 8080
spring:
servlet:
multipart: {max-request-size: 100MB, max-file-size: 100MB } # max-request-size上傳文件總的最大值, multipart.max-file-size單個文件的最大值
file:
staticAccessPath: /static/upload/img/** # 靜態資源對外暴露的訪問路徑
uploadFolder: F:/upload/ #文件上傳目錄(注意Linux和Windows上的目錄結構不同)
三、java代碼
1). 實現WebMvcConfigurer接口(主要做靜態資源目錄映射)
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/*
* 設置虛擬路徑,訪問絕對路徑下資源
*/
@Configuration
public class UploadFilePathConfig implements WebMvcConfigurer {
@Value("${file.staticAccessPath}")
private String staticAccessPath;
@Value("${file.uploadFolder}")
private String uploadFolder;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(staticAccessPath).addResourceLocations("file:" + uploadFolder);
}
}
2).RandomUtils生成隨機數的類
public class RandomUtils {
private static final String charlist = "0123456789";
public static String createRandomString(int len) {
String str = new String();
for (int i = 0; i < len; i++) {
str += charlist.charAt(getRandom(charlist.length()));
}
return str;
}
public static int getRandom(int mod) {
if (mod < 1) {
return 0;
}
int ret = getInt() % mod;
return ret;
}
private static int getInt() {
int ret = Math.abs(Long.valueOf(getRandomNumString()).intValue());
return ret;
}
private static String getRandomNumString() {
double d = Math.random();
String dStr = String.valueOf(d).replaceAll("[^\\d]", "");
if (dStr.length() > 1) {
dStr = dStr.substring(0, dStr.length() - 1);
}
return dStr;
}
}
3.MyCommon上傳文件的工具類
import org.apache.commons.io.FilenameUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.lang.NonNull;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class MyCommon {
private static Map<String, File> dirMap = new HashMap<>();
/**
* 上傳圖片
* @param file 文件流對象
* @param realpath 文件存放路徑
* @return
*/
public static String inputUploadFile(MultipartFile file, String realpath) {
String filename = file.getOriginalFilename();//文件名createFileName(file.getOriginalFilename());//
File dir = getDir(realpath);
String extname = FilenameUtils.getExtension(filename);//文件擴展名
String allowImgFormat = "gif,jpg,jpeg,png";
if (!allowImgFormat.contains(extname.toLowerCase())) {
return "NOT_IMAGE";
}
filename = Math.abs(file.getOriginalFilename().hashCode()) + RandomUtils.createRandomString(4) + "." + extname;
InputStream input = null;
FileOutputStream fos = null;
try {
input = file.getInputStream();
fos = new FileOutputStream(realpath + "/" + filename);
IOUtils.copy(input, fos);
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(fos);
}
return filename;
}
private static String createFileName(String filename) {//重新改變文件名
//FilenameUtils.getExtension(filename);//文件擴展名
String dataReadom = String.valueOf(Math.floor(System.currentTimeMillis() / 1000));
dataReadom += RandomUtils.createRandomString(6);
return dataReadom + FilenameUtils.getExtension(filename);
}
/**
* 判斷目錄是否存在不存在則創建目錄
* @param dirName
* @return
*/
private static File getDir(@NonNull String dirName) {
File dir = dirMap.get(dirName);
if (dir != null) {
return dir;
}
dir = new File(dirName);
if (!dir.exists()) {
dir.mkdirs();
}
dirMap.put(dirName, dir);
return dir;
}
/**
* 獲取網站域名地址
* @param request
* @return
*/
public static String domain(HttpServletRequest request) {
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();// + path;
return basePath;
}
}
四、編寫一個測試上傳文件helloworld(HelloTest類)
import com.alibaba.fastjson.JSONObject;
import com.example.hello2.clacc.MyCommon;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.FileNotFoundException;
@RestController
@RequestMapping(path = "/", produces = "application/json;charset=UTF-8")
public class HelloTest {
@Value("${file.uploadFolder}")
private String uploadFolder;
private String staticAccessPath = "/static/upload/img/";
private JSONObject result;
@RequestMapping(path = "/fileload")
public String Upload(MultipartFile file, HttpServletRequest request) throws FileNotFoundException {
String domain = MyCommon.domain(request);
String basePath = ResourceUtils.getURL("classpath:").getPath();
String fileStr = MyCommon.inputUploadFile(file, uploadFolder);
result = new JSONObject();
if (fileStr.equals("NOT_IMAGE")) {
result.put("msg", "上傳失敗");
result.put("data", fileStr);
result.put("status", 301);
} else {
result.put("msg", "上傳成功");
result.put("data", domain + staticAccessPath + fileStr);
result.put("status", 200);
}
return result.toJSONString();
}
}
五、測試圖
1).postman測試

2).本地目錄

3).瀏覽器訪問

附一、 上傳多圖其實也是這樣只是接收參數改成集合的方式接收
1). 控制器
/**上傳多張圖片**/ @PostMapping(path = "/uploadimgs") public String uploadImgs(@RequestParam("file") List<MultipartFile> files, HttpServletRequest request) throws FileNotFoundException { dataJson = new JSONObject(); String basePath = ResourceUtils.getURL("classpath:").getPath(); List<String> filesStr = MyCommon.inputUploadFiles(files, saveImgPath); dataJson = new JSONObject(); if (filesStr.size() < 1) { dataJson.put("msg", "上傳失敗"); dataJson.put("data", filesStr); dataJson.put("status", 301); } else { dataJson.put("msg", "上傳成功"); dataJson.put("data", filesStr); dataJson.put("status", 200); } return dataJson.toJSONString(); }
2.在MyCommon類中添加一個inputUploadFiles方法
public static List<String> inputUploadFiles(List<MultipartFile> files, String realpath) { List<String> listFile = new ArrayList<>(); for (MultipartFile file : files) { String fileStr = MyCommon.inputUploadFile(file, realpath); if(!fileStr.equals("NOT_IMAGE")){ listFile.add(fileStr); } } return listFile; }
inputUploadFiles
