項目中用的文件服務的上傳和下載訪問的問題,由於疫情沒有辦法接入大的分佈式是文件服務器中,自己就動手搭建一個文件服務器來nginx+spring boot 。
實現的主要思路如下:
spring boot 主要實現文件的上傳功能,上傳到指定的目錄下,這裏所說的是Linux。
nginx 通過配置實現文件的瀏覽和下載功能。
1. sping boot 實現文件的上傳代碼實現如下單個文件和多個文件上傳:
FileUploadController類實現如下:
@ResponseBody
@PostMapping(value = "/upload")
public BaseResponse uploadfile(@RequestParam("file") MultipartFile file){
UploadFileResp uploadFileResp = new UploadFileResp();
try {
String fileName = fileUploadService.handleFileUpload(file).getFileName();
String fileid = getFileNameNoEx(fileName);
uploadFileResp.setFileid(fileid);
fileUploadService.insertFileInfo(fileid,fileName);
log.info("uploadfile="+fileName);
} catch (Exception e) {
log.error(e.getMessage());
return BaseResponse.Exp("上傳文件異常");
}
return BaseResponse.Ok().putData(uploadFileResp);
}
/**
* 多個文件上傳
* @param request
* @return
*/
@ResponseBody
@PostMapping("/multiupload")
public BaseResponse multiuploadfile(HttpServletRequest request){
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
UploadFileResp uploadFileResp = new UploadFileResp();
StringBuilder stringBuilder = new StringBuilder();
try {
for (int i = 0; i < files.size(); i++) {
MultipartFile file = files.get(i);
String fileName = fileUploadService.handleFileUpload(file).getFileName();
String fileidorg = getFileNameNoEx(fileName);
fileUploadService.insertFileInfo(fileidorg,fileName);
stringBuilder.append(fileidorg).append(",");
log.info("uploadfile=" + fileName);
}
String fileid = stringBuilder.toString();
fileid = fileid.substring(0, fileid.length() -1);
uploadFileResp.setFileid(fileid);
} catch (Exception e) {
log.error(e.getMessage());
return BaseResponse.Exp("上傳文件異常");
}
return BaseResponse.Ok().putData(uploadFileResp).putTotal(files.size());
}
FileUploadService 的實現文件的上傳到指定的目錄如下:
// 上傳的文件路徑 如 /data/file/
@Value("${fileUpload.pathToUploadFolder:#{null}}")
public String pathToUploadFolder;
// http://www.file.com/upload/
@Value("${fileUpload.imageUrl:#{null}}")
private String fileImageUrl;
public static class FileModel {
public String getFileName() {
return fileName;
}
@JsonProperty("file_name")
public String fileName;
public FileModel(String fileName) {
this.fileName = fileName;
}
}
public FileModel handleFileUpload( MultipartFile file) throws Exception {
String name = file.getOriginalFilename();
log.info("try load image " + name);
String newPhotoName = FileUploadHelper.getUniqueName(name);
log.info("generate new unique file name " + newPhotoName);
if (file.isEmpty()) {
log.error("file " + name + " is empty");
throw new IllegalArgumentException("Uploaded file is empty");
}
// 不關心上傳文件類型
//if (!FileUploadHelper.isImageContentType(file.getContentType())) {
// log.error("No supported content type " + file.getContentType());
// MediaType mediaType = MediaType.parseMediaType(file.getContentType());
// //throw Exception;
//}
String path = pathToUploadFolder + newPhotoName;
log.info("path to upload file - " + path);
try {
byte[] bytes = file.getBytes();
BufferedOutputStream stream =
new BufferedOutputStream(
new FileOutputStream(new File(path)
)
);
stream.write(bytes);
stream.close();
log.info("file successfully save by path - " + path);
return new FileModel(newPhotoName);
} catch (Exception e) {
log.debug("error save file by path " + path, e);
throw new Exception("No file was uploaded");
}
}
對文件中的名稱進行uuid
public static String getUniqueName(String oldFileName) {
String extension = getFileExtension(oldFileName);
String newName = UUID.randomUUID().toString();
return newName + '.' + extension;
}
2. nignx 文件中配置如下:
http 處添加如下:
autoindex on;# 顯示目錄
autoindex_exact_size on;# 顯示文件大小
autoindex_localtime on;# 顯示文件時間
添加server 節點:
server {
listen 4040 default_server;
listen [::]:4040 default_server;
server_name _;
root /data/file/;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
到此已成了文件的上傳和下載相關操作,謝謝大家斧正,謝謝。