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 2354713722@qq.com
 * @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 2354713722@qq.com
 * @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 2354713722@qq.com
 * @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 2354713722@qq.com
 * @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 2354713722@qq.com
 * @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);
    }
}

测试

在这里插入图片描述

访问资源

在这里插入图片描述

如果对大家有帮助,欢迎关注下个人公众号,谢谢,哈哈

在这里插入图片描述

Spring Boot 提供了方便的方式来处理文件上传下载。下面我们来详细了解一下它的用法。 ## 文件上传 ### 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.5.5</version> </dependency> ``` ### 2. 配置文件上传限制 在配置文件中增加以下配置: ```yaml spring: servlet: multipart: max-file-size: 10MB # 最大文件大小 max-request-size: 20MB # 最大请求大小 ``` ### 3. 创建文件上传接口 创建一个文件上传接口,代码如下: ```java @RestController public class FileUploadController { private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class); @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { try { // 获取文件名 String fileName = file.getOriginalFilename(); // 获取文件内容 byte[] content = file.getBytes(); // 处理文件内容 // ... return "上传成功!"; } catch (IOException e) { logger.error("文件上传失败!", e); } return "上传失败!"; } } ``` ### 4. 测试文件上传 使用 Postman 等工具测试文件上传接口即可。 ## 文件下载 ### 1. 添加依赖 同文件上传。 ### 2. 创建文件下载接口 创建一个文件下载接口,代码如下: ```java @RestController public class FileDownloadController { private static final Logger logger = LoggerFactory.getLogger(FileDownloadController.class); @GetMapping("/download") public void downloadFile(HttpServletResponse response) { try { // 获取文件路径 String filePath = "file.txt"; // 获取文件内容 byte[] content = Files.readAllBytes(Paths.get(filePath)); // 设置响应头 response.setContentType("text/plain"); response.setHeader("Content-Disposition", "attachment; filename=file.txt"); // 写出文件内容 OutputStream outputStream = response.getOutputStream(); outputStream.write(content); outputStream.flush(); outputStream.close(); } catch (IOException e) { logger.error("文件下载失败!", e); } } } ``` ### 3. 测试文件下载 使用浏览器访问文件下载接口即可下载文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值