spring controller实现下载文件的两种方式

75 篇文章 2 订阅
13 篇文章 1 订阅

方式1,比较古老的方式:

@RestController("/download")
public class FileDownloadController {

    @GetMapping("/downloadFile")
    public ResponseEntity downloadFile(String path,HttpServletResponse response){

        path = "D:\\Users\\lvxy\\Downloads\\Feishu-win32_ia32-4.3.7-signed.exe";

        try {
            // path是指欲下载的文件的路径。
            File file = new File(path);
            // 取得文件名。
            String filename = file.getName();
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();

            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));

            byte[] buffer = new byte[fis.available()];

            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();

            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");

            /* 与上等同
            HttpHeaders headers = new HttpHeaders();
            //将编码加到http头信息中
            headers.setContentDispositionFormData("attachment", filename);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.add("isSuccess", "true");
            return new ResponseEntity<>(file, headers, HttpStatus.CREATED);
            */

            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return (ResponseEntity) response;
    }

    /**
     * 下载网络文件
     * @param response
     * @throws MalformedURLException
     */
    public void downloadNet(HttpServletResponse response) throws MalformedURLException {
        // 下载网络文件
        int bytesum = 0;
        int byteread = 0;

        URL url = new URL("windine.blogdriver.com/logo.gif");

        try {
            URLConnection conn = url.openConnection();
            InputStream inStream = conn.getInputStream();
            FileOutputStream fs = new FileOutputStream("c:/abc.gif");

            byte[] buffer = new byte[1204];
            int length;
            while ((byteread = inStream.read(buffer)) != -1) {
                bytesum += byteread;
                System.out.println(bytesum);
                fs.write(buffer, 0, byteread);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //支持在线打开文件的一种方式
    public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
        File f = new File(filePath);
        if (!f.exists()) {
            response.sendError(404, "File not found!");
            return;
        }
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
        byte[] buf = new byte[1024];
        int len = 0;

        response.reset(); // 非常重要
        if (isOnLine) { // 在线打开方式
            URL u = new URL("file:///" + filePath);
            response.setContentType(u.openConnection().getContentType());
            response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
            // 文件名应该编码成UTF-8
        } else { // 纯下载方式
            response.setContentType("application/x-msdownload");
            response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
        }
        OutputStream out = response.getOutputStream();
        while ((len = br.read(buf)) > 0)
            out.write(buf, 0, len);
        br.close();
        out.close();
    }


}

方式2,使用spring的resource接口:

@RestController
public class XliffParserController {

    @Autowired
    private DealXliffService dealXliffService;

    @SneakyThrows
    @GetMapping("/downloadFile")
    public ResponseEntity<Resource> downloadFile(Long catProjectId, Long catFileId, String fileType, MultipartFile xliffFile, HttpServletResponse response) {

        List<CatDocument> res = dealXliffService.xliffParser(catProjectId, catFileId, fileType, xliffFile);

        // 需要写入的数据
        String json = JSONUtil.toJsonStr(res);
        // 生成文件名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String xliffFileName = xliffFile.getOriginalFilename();
        String jsonFileName = uuid + "_" + xliffFileName + ".json";
        String jsonName = xliffFileName + ".json";

        // 写文件
        File file = FileUtils.saveFile(Path.JSON + jsonFileName);
        FileUtils.write2File(json, file);

        String contentDisposition = ContentDisposition
                .builder("attachment")
                .filename(jsonName)
                .build().toString();
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
                .contentType(MediaType.MULTIPART_FORM_DATA)
                .body(new FileSystemResource(file));
    }
}

或者

public static ResponseEntity<FileSystemResource> downloadReturn(String fileName, File file){
    if (!file.isFile()) {
        try {
            throw new FileNotFoundException();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    HttpHeaders headers = new HttpHeaders();
    headers.add("content-length",((Long)file.length()).toString());
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    try {
        fileName = URLEncoder.encode(fileName, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    fileName = fileName.replaceAll("\\+","%20");
    headers.add("Content-Disposition", "attachment;filename=" + fileName);
    HttpStatus status = HttpStatus.OK;
    return new ResponseEntity<>(new FileSystemResource(file), headers, status);
}
/**
 * @ClassName: FileUtils
 * @Date: 2022/2/22
 * @Author: lvxy
 */
public class FileUtils {

    /**
     * 创建文件
     * @param filePath 文件路径
     * @return 文件
     */
    public static File saveFile(String filePath){
        File file = new File(filePath);
        File parentFile = file.getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();// 创建多级目录
        }
        return file;
    }

    /**
     * 向指定文件写内容
     * @param json 写入字符
     * @param file 文件
     */
    public static void write2File(String json, File file) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8);
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter,1024);
        bufferedWriter.write(json);
        bufferedWriter.flush();
        // close
        fileOutputStream.close();
        outputStreamWriter.close();
        bufferedWriter.close();
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L-960

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值