Springboot文件上傳和下載

文件配置

server:
  # 文件上傳
  servlet:
    multipart:
      enabled: true
      file-size-threshold: 2KB
      max-file-size: 20MB
      max-request-size: 20MB
# 自定義文件配置信息      
file:
  upload:
    # 文件映射路徑
    fileUrl: /api/file/**
    # 文件類型
    fileType: xls,xlsx,png,jpg
    # 文件真實路徑
    filePath: C:/Users/long/Desktop/upload-file-city/

文件操作工具類

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName FileUtils.java
 * @Email [email protected]
 * @Description TODO
 * @createTime 2019年08月27日 - 15:17
 */
public class FileUtils {

    private static final Logger log = LoggerFactory.getLogger(FileUtils.class);

    /**
     * 文件上傳
     * @param file       HTML中form data方式上傳的文件,包含二進制數據+文件名稱
     * @param baseDir    文件保存的基本路徑
     * @param fileType   文件類型
     * @return Map<String, String>
     * @throws IOException
     */
    public static Map<String, String> UploadFile (MultipartFile file, String baseDir, String fileType) throws IOException {
        // 獲取後綴
        String suffix = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf(".") + 1);
        List<String> types = Arrays.asList(fileType.split(","));
        List<String> result = types.stream().filter(item -> {
            return suffix.equals(item);
        }).collect(Collectors.toList());
        if (result.size() >= 1) {
            // 設置文件路徑
            String fileDir =  UUID.randomUUID() + String.valueOf(System.currentTimeMillis()) + "." + suffix;
            // 實例化文件路徑
            File saveFile = new File(baseDir + File.separator + fileDir);
            // 不存在則創建
            if (!saveFile.getParentFile().exists()) { saveFile.getParentFile().mkdirs(); }
            file.transferTo(saveFile);
            log.info("{} 上傳成功", file.getOriginalFilename());
            Map<String, String> map = new HashMap<>();
            map.put("fileName", file.getOriginalFilename());
            map.put("fileUrl", fileDir);
            return map;
        } else {
            log.error("{} 類型錯誤", file.getOriginalFilename());
            throw new IOException(file.getOriginalFilename() + "類型錯誤");
        }
    }

    /**
     * 文件下載
     * @param filePath     文件存儲的路徑
     * @param fileName     文件名字
     * @param fileUrl      文件路徑
     * @param response     HttpServletResponse 返回response
     * @throws UnsupportedEncodingException
     */
    public static void downloadFile(String filePath, String fileName, String fileUrl, HttpServletResponse response) throws UnsupportedEncodingException {
        // 配置文件下載
        response.setHeader("content-type", "application/octet-stream");
        response.setContentType("application/octet-stream");
        // 下載文件能正常顯示中文
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        String file = filePath + fileUrl;
        try (
                FileInputStream fileInputStream = new FileInputStream(new File(file));
                BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        ) {
            byte[] buffer = new byte[1024];
            OutputStream outputStream = response.getOutputStream();
            int i = bufferedInputStream.read(buffer);
            while (i != -1) {
                outputStream.write(buffer, 0, i);
                i = bufferedInputStream.read(buffer);
            }
            log.info("{} 文件下載成功", fileName);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("{} 文件下載失敗", fileName);
        }
    }
}

文件路徑映射路徑

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName FileConfig.java
 * @Email [email protected]
 * @Description TODO
 * @createTime 2019年08月27日 - 15:31
 */
@Configuration
public class FileConfig extends WebMvcConfigurationSupport {

    @Autowired
    private OwnerConfig ownerConfig;

    /**
     * 配置本地資源映射
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 資源映射路徑
        registry.addResourceHandler(ownerConfig.getFileUrl())
                // 本地資源路徑
                .addResourceLocations("file:" + ownerConfig.getFilePath());
        super.addResourceHandlers(registry);
    }
}

文件讀取配置類

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName OwerConfig.java
 * @Email [email protected]
 * @Description TODO
 * @createTime 2019年08月27日 - 15:38
 */
@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "file.upload")
public class OwnerConfig {

    private String fileUrl;

    private String filePath;

    private String fileType;

}

文件Service類

import com.city.cluster.config.OwnerConfig;
import com.city.cluster.entity.FileEntity;
import com.city.cluster.repository.FileRepository;
import com.city.cluster.service.FileService;
import com.city.cluster.utils.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.*;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName FileServiceImpl.java
 * @Email [email protected]
 * @Description TODO
 * @createTime 2019年08月27日 - 11:21
 */
@Service
public class FileServiceImpl implements FileService {

    private static final Logger log = LoggerFactory.getLogger(FileServiceImpl.class);

    @Autowired
    private OwnerConfig ownerConfig;
    
    @Autowired
    private FileRepository fileRepository;

    @Override
    public FileEntity uploadFile(MultipartFile file) throws IOException {
        Map<String, String> uploadFile = FileUtils.UploadFile(file, ownerConfig.getFilePath(), ownerConfig.getFileType());
        FileEntity fileEntity = new FileEntity()
                .setFileName(uploadFile.get("fileName"))
                .setFileUrl(uploadFile.get("fileUrl"))
                .setUserId(UUID.randomUUID().toString().replaceAll("-", ""))
                .setCreateTime(new Date(System.currentTimeMillis()))
                .setUpdateTime(new Date(System.currentTimeMillis()));
        return fileRepository.save(fileEntity);
    }

    @Override
    public FileEntity getOneFileById(String fileId) {
        return fileRepository.getOne(fileId);
    }
}

控制器

import com.city.cluster.config.OwnerConfig;
import com.city.cluster.entity.FileEntity;
import com.city.cluster.service.FileService;
import com.city.cluster.utils.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.UUID;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName HomeController.java
 * @Email [email protected]
 * @Description TODO
 * @createTime 2019年08月27日 - 09:35
 */
@RestController
@RequestMapping("/api")
public class HomeController {

    @Autowired
    private FileService fileService;

    @Autowired
    private OwnerConfig ownerConfig;

    /**
     * 文件上傳
     * @param file
     * @return
     */
    @PostMapping("/home")
    public Object home(MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        return fileService.uploadFile(file);
    }

    /**
     * 文件下載
     * @param fileId
     * @param response
     * @throws UnsupportedEncodingException
     */
    @GetMapping("/download")
    public void downloadFile(@RequestParam("fileId") String fileId, HttpServletResponse response) throws UnsupportedEncodingException {
        FileEntity fileEntity = fileService.getOneFileById(fileId);
        FileUtils.downloadFile(ownerConfig.getFilePath(), fileEntity.getFileName(), fileEntity.getFileUrl(), response);
    }
}

測試

在這裏插入圖片描述

訪問資源

在這裏插入圖片描述

如果對大家有幫助,歡迎關注下個人公衆號,謝謝,哈哈

在這裏插入圖片描述

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