java 调用第三方接口返回文件流并下载文件

本文介绍了如何使用Spring Boot实现一个文件下载功能,涉及POST请求处理、SSO生成、参数传递,以及通过RestTemplate调用第三方接口并下载文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@PostMapping("/file/download")
    public AjaxResult downFileById(@RequestBody FileInput input,HttpServletResponse response) throws IOException {
        String creditCode = input.getCreditCode();
        //生成 sso
        String sso = createSso(creditCode);
        Long fileId = input.getFileId();
        Map<String,Object> requestParam = new HashMap<>();
        // 设置请求参数
        requestParam.put("sso",sso);
        requestParam.put("id",fileId);
        // 调用第三方接口
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity request = new HttpEntity(requestParam, headers);
        //当接受一个文件流时必须使用 resource (spring)接收
        ResponseEntity<Resource> entity = restTemplate.postForEntity(FILEURL, request,Resource.class);
        InputStream in = entity.getBody().getInputStream();
        //调用下载文件接口
        FileUtils fileUtils = new FileUtils();
        fileUtils.downloadFile(response,in,"123.doc");
        return AjaxResult.success();
    }




public AjaxResult downloadFile(HttpServletResponse response, InputStream inputStream, String filename) {
        filename = UriUtils.encode(filename, "UTF-8");
        response.setContentType("multipart/form-data;");
        response.setContentType("application/force-download");
        //设置下载的文件名
        response.addHeader("Content-Disposition", "attachment;fileName*=UTF-8''" + filename);
        byte[] buffer = new byte[1024];
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(inputStream);
            OutputStream os = response.getOutputStream();
            int i = bis.read(buffer);
            while (i != -1) {
                os.write(buffer, 0, i);
                i = bis.read(buffer);
            }
        } catch (Exception e) {
            return AjaxResult.error();
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                }
            }
        }

        return null;
    }

### Java接口返回数据示例 对于Java接口返回的数据,通常会采用JSON格式来传输对象。下面是一个简单的例子展示如何构建返回一个包含中文字符的对象。 #### 定义实体类 首先创建一个用于封装响应信息的实体类 `ResponseEntity`: ```java @Data public class ResponseEntity implements Serializable { private static final long serialVersionUID = 1L; /** 状态码 */ private int code; /** 提示消息 */ private String message; /** 数据体 */ private Object data; } ``` 当需要返回带有特定业务逻辑的结果时,则可以实例化此对象将所需的信息填充进去[^1]。 #### 控制器方法实现 接着,在Spring Boot控制器中编写相应的方法以处理HTTP请求向客户端发送响应: ```java @RestController @RequestMapping("/api") public class ExampleController { @GetMapping("/example") public ResponseEntity getExample() { // 创建实体对象设置属性值 SupplyFeaturesVo supplyFeaturesVo = new SupplyFeaturesVo(); supplyFeaturesVo.setHouseType("公寓"); supplyFeaturesVo.setRoomType("一室一厅"); supplyFeaturesVo.setAcg("89平方米"); supplyFeaturesVo.setAvg("每平米5000元"); supplyFeaturesVo.setNum("共出售了3套"); // 构建返回结果 return ResponseEntity.builder() .code(200) .message("成功获取房源特征") .data(supplyFeaturesVo) .build(); } } ``` 这段代码展示了如何通过GET方式访问 `/api/example` 接口返回一个包含了房屋特性的 JSON 对象给调用者[^2]。 ### 解决中文乱码问题 如果遇到Java接口返回中文字乱码的情况,这通常是由于编码配置不一致所引起的。确保服务器端和客户端都使用相同的字符集非常重要。以下是几种可能的解决方案: - **调整Tomcat连接器参数**:可以在应用服务器(如Apache Tomcat)中的server.xml文件里修改Connector标签下的URIEncoding属性为UTF-8。 - **设置HttpServletResponse的内容类型**:在Servlet或Spring MVC Controller内显式指定Content-Type头部字段为application/json;charset=UTF-8。 - **检查前端页面meta声明**:<head>部分应含有<meta charset="utf-8">这样的语句,保证浏览器能够正确解析接收到的内容。 以上措施有助于防止因编码差异而导致的显示异常现象发生。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值