SpringBoot的文件下载

SpringBoot的文件下载方法有很多,此处只记录使用Spring的Resource实现类FileSystemResource做下载,其余实现类照葫芦画瓢即可。
直接上干货

1、下载部分代码

    public ResponseEntity<FileSystemResource> export(File file) {
        if (file == null) {
            return null;
        }
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Content-Disposition", "attachment; filename=" + System.currentTimeMillis() + ".xls");
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        return ResponseEntity
                .ok()
                .headers(headers)
                .contentLength(file.length())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(new FileSystemResource(file));
    }

这段代码,我是封装在BaseController.class,其他的Controller继承该类,就可直接调用父类的下载方法,service只需要提供文件file即可。

2、实例展示

@RestController
@RequestMapping(value = "/order", method = RequestMethod.POST)
public class OrderController extends BaseController {

    @Autowired
    private IOrderService orderService;

    @RequestMapping(value = "/export")
    public ResponseEntity<FileSystemResource> listExport(String proNo) {
        File file = orderService.listExport(proNo);
        return export(file);
    }
    }

注意:此处使用的下载返回是FileSystemResource,所以service提供的是File。
以下是百度到的Resource其它实现类,引用来自http://elim.iteye.com/blog/2016305

ClassPathResource 可用来获取类路径下的资源文件。假设我们有一个资源文件test.txt在类路径下,我们就可以通过给定对应资源文件在类路径下的路径path来获取它,new ClassPathResource(“test.txt”)。
FileSystemResource可用来获取文件系统里面的资源。我们可以通过对应资源文件的文件路径来构建一个FileSystemResource。FileSystemResource还可以往对应的资源文件里面写内容,当然前提是当前资源文件是可写的,这可以通过其isWritable()方法来判断。FileSystemResource对外开放了对应资源文件的输出流,可以通过getOutputStream()方法获取到。
UrlResource可用来代表URL对应的资源,它对URL做了一个简单的封装。通过给定一个URL地址,我们就能构建一个UrlResource。
ByteArrayResource是针对于字节数组封装的资源,它的构建需要一个字节数组。
ServletContextResource是针对于ServletContext封装的资源,用于访问ServletContext环境下的资源。ServletContextResource持有一个ServletContext的引用,其底层是通过ServletContext的getResource()方法和getResourceAsStream()方法来获取资源的。
InputStreamResource是针对于输入流封装的资源,它的构建需要一个输入流。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
SpringBoot是一款流行的框架,用于开发Web应用程序。在使用SpringBoot构建Web应用程序时,可能需要实现文件下载的功能。文件下载是指在Web应用程序中提供用户下载文件的功能。这可以是图片、PDF、音频或文档等格式的文件。通常情况下,文件下载需要从服务器端向客户端传输文件SpringBoot为此提供了很多支持。 SpringBoot提供了一种基于Restful的方式进行文件下载。在SpringBoot中,可以使用ResponseEntity<byte[]>类来表示数据,这是一个特殊的ResponseEntity响应类型,它允许向客户端提供二进制数据。要下载文件,需要使用ResponseEntity<byte[]>将文件的字节流封装到响应中。该字节流可以来自于你的本地文件系统、数据库或其他数据源。 为了让用户下载文件,需要根据请求头中的Accept参数来返回正确的文件类型。用Content-Type头来通知浏览器返回的数据类型。可以使用以下代码实现该功能: ``` @GetMapping("/download") public ResponseEntity<byte[]> downloadFile() { // 从文件路径中获取输入流 InputStream input = new FileInputStream(new File("path/to/file")); byte[] bytes = IOUtils.toByteArray(input); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF); // 设置Content-Type headers.setContentDispositionFormData("attachment", "file.pdf"); // 文件名 ResponseEntity<byte[]> response = new ResponseEntity<>(bytes, headers, HttpStatus.OK); return response; } ``` 在这个例子中,使用了Java IO流。首先将从文件路径中获取的输入流读入到字节数组中,然后设置响应的头信息,包括Content-Type和Content-Disposition。最后将字节数组和响应头一起封装到ResponseEntity<byte[]>响应实体中,并返回。 在SpringBoot中,可以轻松实现文件下载的功能。以上代码仅仅是其中之一的实现方式。具体实现方式会依据实际情况有所不同。使用SpringBoot提供的ResponseEntity类提供二进制数据,可以以Restful的方式来下载文件。这样的方式不仅简单,方便,而且支持多种文件类型。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值