package com.example.common.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.http.HttpStatus;
import com.example.common.entity.SysFile;
import com.example.common.service.SysFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.nio.charset.StandardCharsets;
@Validated
@Api(tags = "文件")
@RestController
@RequiredArgsConstructor
@RequestMapping("/file")
public class SysFileController {
private final SysFileService fileService;
@Value("${file-path}")
private String basePath;
/**
* 文件下载
* @param id
* @param response
*/
@GetMapping("/{id}")
@ApiOperation("获取文件")
public void get(@PathVariable String id, HttpServletResponse response) {
SysFile file = fileService.getById(id);
if (file != null) {
//文件名乱码处理
URLUtil.encode(file.getName(), StandardCharsets.UTF_8);
//告知浏览器文件的类型(响应体)
response.setContentType(file.getContentType());
response.setContentLength(file.getSize().intValue());
//告知浏览器以附件的方式提供下载功能, 而不是解析
response.setHeader("Content-Disposition", "attachment;fileName=" + URLUtil.encode(file.getName(), StandardCharsets.UTF_8));
ServletUtil.write(response, FileUtil.getInputStream(StrUtil.addSuffixIfNot(basePath, File.separator) + file.getPath()));
} else {
response.setStatus(HttpStatus.HTTP_NOT_FOUND);
}
}
}
下载附件,返回文件流
于 2021-04-28 13:51:51 首次发布
993

被折叠的 条评论
为什么被折叠?



