02_学习使用javax_ws_rs_下载文件

1 前言

  专栏上一篇,写了如何使用 javax.ws.rs 上传文件,那么必然的,我们得再学习学习如何下载文件😀

2 Maven 依赖

  这个就不赘述了,和上一篇,文件上传的 Maven 依赖一样。

3 下载接口

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/test")
public interface TestController {
    @GET
    @Path("download")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    Response download(@QueryParam("paramOne") String paramOne,
                    @QueryParam("paramTwo") String paramTwo);
}

4 如何返回文件?

import org.springframework.util.Assert;
import javax.ws.rs.core.Response;

public class TestService {
    public Response download(String paramOne, String paramTwo) {
        try {
            Assert.hasText(paramOne, "paramOne 不能为空");
            Assert.hasText(paramTwo, "paramTwo 不能为空");

            // 具体的业务逻辑, 产生了个文件
            File file = doSomethingThenGetAFile();
            String fileName = "text测试文件.txt";
            // URL 编码, 因为有中文
            this.urlEncodeFilename(fileName);
            return Response.ok()
                    .entity(file)
                    .header("Content-disposition", "attachment;filename*=utf-8''" + fileName)
                    .header("Content-Type", "text/plain")
                    .encoding("utf-8")
                    .build();
        } catch (Exception e) {
            logger.error("下载文件出现异常", e);
            return Response.ok()
                    .entity(JsonResult.fail(e.getMessage()))
                    .header("Content-Type", "application/json")
                    .encoding("utf-8")
                    .build();
        }
    }

    /**
     * 对 filename 进行 URL 编码
     *
     * @param filename 文件名
     * @return 编码后的文件名
     */
    public String urlEncodeFilename(String filename) {
        try {
            return URLEncoder.encode(filename, StandardCharsets.UTF_8.name());
        } catch (UnsupportedEncodingException e) {
            log.error("对文件名 {}, 进行 URL 编码时, 出现异常 {}", filename, e.getMessage());
            throw new RuntimeException("对文件名 " + filename + ", 进行 URL 编码时, 出现异常", e);
        }
    }
}

5 感谢

  感谢阅读~ 如有错误之处,请帮忙指正~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值