Java实现下载本项目下的文件

Java实现下载本项目下的文件

话不多说,直接贴代码

package com.komlin.common.utils;

import org.apache.commons.io.IOUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * 本地文件下载工具类
 */
public class LocalFileDownload {

    /**
     *
     * @param request 客户端请求
     * @param response  响应
     * @param relativePath  文件的路径
     * @param fileName  文件名
     */
    public static void read(HttpServletRequest request, HttpServletResponse response, String relativePath, String fileName) {
      try {
          InputStream is = LocalFileDownload.class.getResourceAsStream("/" + relativePath + fileName);
          byte[] data = IOUtils.toByteArray(is);
          response.reset();
          response.setContentType("application/octet-stream; charset=UTF-8");
          response.setHeader("Content-Disposition", "attachment;fileName=" + setFileDownloadHeader(request, fileName));
          response.addHeader("Content-Length", "" + data.length);
          response.setHeader("Pragma", URLEncoder.encode(fileName, "UTF-8"));
          response.setContentType("application/octet-stream; charset=UTF-8");
          IOUtils.write(data, response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
        final String agent = request.getHeader("User-Agent");
        String filename = fileName;
        if (agent.contains("MSIE")) {
          // IE浏览器
          filename = URLEncoder.encode(filename, "UTF-8");
          filename = filename.replace("+", " ");
        } else if (agent.contains("Firefox")) {
          // 火狐浏览器
          filename = new String(fileName.getBytes(), "UTF-8");
        } else if (agent.contains("Chrome")) {
          // google浏览器
          filename = URLEncoder.encode(filename, "UTF-8");
        } else {
          // 其它浏览器
          filename = URLEncoder.encode(filename, "UTF-8");
        }
        return filename;
    }
}

注:只需要把提供给客户端下载的文件放入指定的路径下,然后通过接口请求返回给客户端,给大家贴下controller层的代码,有助于理解
package com.komlin.project.common;

import com.komlin.common.utils.LocalFileDownload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 下载本地文件
 *
 * @author mt
 */
@Controller
@RequestMapping
public class DownFileController {

    @RequestMapping(value = "/system/util/downExcel", method = RequestMethod.GET)
    public void downFile(int type, HttpServletRequest request, HttpServletResponse response) {
        try {
            String name = "";
            if (type == 1) {
                name = "学生基本信息导入模版.xlsx";
            } else if (type == 2) {
                name = "入库单导入模版.xlsx";
            } else if (type == 3) {
                name = "物资出库记录导入模版.xlsx";
            } else if (type == 26){
                name = "wbd.apk";
            }

            LocalFileDownload.read(request, response, "static/excel/", name);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以下为文件夹层级关系
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SpringBoot实现文件下载可以通过以下步骤: 1. 在Controller添加一个请求处理方法,该方法返回一个ResponseEntity<byte[]>类型的结果。 2. 在该方法,使用Java的FileInputStream类加载要下载文件,并将其以byte数组形式返回。 3. 设置ResponseEntity的HTTP头信息,包括Content-Type和Content-Disposition,其Content-Disposition的值为“attachment; filename=文件名.扩展名”,表示以附件形式下载文件。 4. 最后,返回ResponseEntity对象即可。 以下是示例代码: ```java @GetMapping("/download/{fileName}") public ResponseEntity<byte[]> downloadFile(@PathVariable String fileName) throws IOException { File file = new File("文件路径/" + fileName); FileInputStream fis = new FileInputStream(file); byte[] bytes = new byte[(int) file.length()]; fis.read(bytes); fis.close(); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/octet-stream"); headers.add("Content-Disposition", "attachment; filename=" + fileName); ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, HttpStatus.OK); return responseEntity; } ``` 其,`@GetMapping("/download/{fileName}")`表示该方法处理的请求路径为/download/文件名,`@PathVariable`注解表示将路径文件名作为参数传入方法。 需要注意的是,为了确保文件能够被正确下载,需要在HTTP头信息设置Content-Length字段,该字段的值为要下载文件大小。但是,由于文件大小通常比较大,因此这种做法可能会导致服务器资源浪费。因此,在示例代码,我们没有设置Content-Length字段,而是将整个文件内容一次性返回。这种做法虽然不够优雅,但对于小文件来说是可行的。如果需要处理大文件,建议使用分块下载的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值