springboot 實現單文件上傳/多文件上傳/文件下載

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

關注我的公衆號:程序員小棧
一起來交流學習吧

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