springboot 设置下载url头部为附件

import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.net.MalformedURLException;
import java.nio.file.Path;
import java.nio.file.Paths;

@Controller
public class FileDownloadController {

    @GetMapping("/download")
    public ResponseEntity<Path> downloadFile(@RequestParam String url, @RequestParam String filename) {
        try {
            // 将传入的下载链接转换为UrlResource
            UrlResource urlResource = new UrlResource(this.getClass().getResource(url));
            if (!urlResource.exists() || !urlResource.isReadable()) {
                throw new RuntimeException("Could not read the file!");
            }

            // 构建HTTP响应头
            HttpHeaders headers = new HttpHeaders();
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");
            headers.add(HttpHeaders.CACHE_CONTROL, "must-revalidate, post-check=0, pre-check=0");

            // 根据文件类型设置Content-Type
            String contentType = null;
            try {
                contentType = urlResource.getContentType();
            } catch (MalformedURLException e) {
                // Handle the exception
            }
            if (contentType == null) {
                contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
            }
            headers.setContentType(MediaType.parseMediaType(contentType));

            // 返回ResponseEntity,其中包含文件内容和HTTP头信息
            return ResponseEntity.ok()
                    .headers(headers)
                    .contentLength(urlResource.contentLength())
                    .body(Paths.get(urlResource.getURI()));
        } catch (Exception e) {
            // 处理异常情况,例如文件不存在或读取错误
            e.printStackTrace();
            return ResponseEntity.internalServerError().build();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值