spring boot+ nginx 搭建簡單的文件服務器,實現上傳下載

項目中用的文件服務的上傳和下載訪問的問題,由於疫情沒有辦法接入大的分佈式是文件服務器中,自己就動手搭建一個文件服務器來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 {
                }
        }

到此已成了文件的上傳和下載相關操作,謝謝大家斧正,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章