java 開發經常需要用到文件上傳,接下來博主就創建一個springboot項目,實現單文件上傳/多文件上傳/文件下載功能
1.先看一下博主的項目結構圖
2.application.yml主要配置
3.如上圖創建項目
創建FileUpload類:
package com.study.controller;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/file")
public class FileUpload {
private static final Logger LOGGER = LoggerFactory.getLogger(FileUpload.class);
@Value("${upload.path}") //在application中配置的上傳地址:
private String uploadPath;
@PostMapping("/upload")
//單文件上傳
public Boolean upload(@RequestParam("file") MultipartFile file) {
BufferedOutputStream stream = null;
try {
if (file.isEmpty()) {
LOGGER.info("文件爲空:");
return false;
}
// 獲取文件名
String fileName = file.getOriginalFilename();
LOGGER.info("上傳的文件名爲:" + fileName);
// 獲取文件的後綴名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
LOGGER.info("文件的後綴名爲:" + suffixName);
File dest = new File(uploadPath + fileName);
// 檢測是否存在目錄
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
file.transferTo(dest);
LOGGER.info("文件的上傳路徑:" + uploadPath);
return true;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
//多文件上傳
@PostMapping("/uploadMore")
public boolean handleFileUpload(HttpServletRequest request) {
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
MultipartFile file = null;
for (int i = 0; i < files.size(); ++i) {
file = files.get(i);
if (!file.isEmpty()) {
try {
String fileName = file.getOriginalFilename();
File dest = new File(uploadPath + fileName);
file.transferTo(dest);
} catch (Exception e) {
LOGGER.info("第{0}個文件上傳失敗 ==>{1} ",i,e.getMessage());
return false;
}
} else {
LOGGER.info("第{0}個文件爲空,上傳失敗 ",i);
return false;
}
}
return true;
}
}
文件上傳:
接下來使用接口測試工具postman測試:(注意:這裏測試的單文件上傳接口,多文件上傳接口同理)
查看上傳文件:
文件下載:
1.配置攔截器,攔截器代碼,在哪裏配置請參考文章開始目錄結構圖
package com.study.controller.config;
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 MyWebAppConfigurer implements WebMvcConfigurer {
@Value("${upload.path}") //application中配置的文件上傳路徑
private String path;
@Value("${upload.staticPath}") //application中配置的瀏覽器中的映射路徑
private String staticPath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//當用戶訪問http://localhost:8080/api/file/WeChat Image_20190928085046.jpg的時候
//會把api/file映射爲本地真實路徑
//這裏會把上面這個訪問地址映射爲:
//http://localhost:8080/G:/IdeaWorkSpace/MyStudyCollection/upload//WeChat //Image_20190928085046.jpg
registry.addResourceHandler(staticPath +"/**").addResourceLocations("file:" + path);
}
}
啓動項目訪問:http://localhost:8080/api/file/WeChat%20Image_20190928085046.jpg(圖片自動打開,其他文件提示下載)
springboot實現單文件上傳/多文件上傳/文件下載就完成了
項目git地址:https://gitee.com/Vince-ZZ/MyStudyCollection/tree/master/study-web
關注我的公衆號:程序員小棧
一起來交流學習吧