sofa接口下载文件
1.读取jar包中resource下文件
正常我们在本地debug代码的时候,用File的方式,或者其他ResourceUtil的方式,都可以取到resource下的文件,但是打成jar包发到线上,就会报取不到文件
解决办法:
PathMatchingResourcePatternResolver
注意路径必须带
classpath*:
如果不带classpath*: 那么进行空判断时,就算这个文件不存在,ObjectUtils.isEmpty也不会返回true
以下为正确示例代码
public byte[] readFile(String cityId) throws Exception {InputStream resourceAsStream = null;ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources("classpath*:"+cityId+"_zip_base.txt");//如果指定城市对应的配置文件为空 那就取原型默认的if(ObjectUtils.isEmpty(resources)){resources = resolver.getResources("classpath*:00000_zip_base.txt");}if(!ObjectUtils.isEmpty(resources)){resourceAsStream = resources[0].getInputStream();ByteArrayOutputStream outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024*4];int n = 0;while (-1 != (n = resourceAsStream.read(buffer))) {outputStream.write(buffer, 0, n);}return outputStream.toByteArray();}else{throw new PlatRuntimeException(ErrorCodeConstant.downloadFileError, null, "文件读取出错");}}
补充
Thread.currentThread().getContextClassLoader("资源文件名")也可以加载资源文件 ,
参考这个博客,可以通过static代码块,在初始化时就把资源文件加载进来 CSDN
2.如何在本地测试是否能读到jar包中的文件
我开始一遍一遍的重启线上,但是这势必会影响别人使用
然后本地install一个jar包,java -jar自己调试
还有一个坑,本地jar包好用但是线上还是不好用,clean一下
3.入口和出口参数格式
@Consumes设置入口参数格式
@Produces设置出口参数格式
@Consumes("application/json;charset=UTF-8")
@Produces("application/octet-stream")
在org.springframework.http.MediaType可以看到所有类型的格式
在spring的http包下,截图只是一部分
其实,这不是sofa特有的,点开@RequestMapping注解,也有 consumes属性和produces属性
@RequestMapping(consumes={"multipart/form-data",""},produces={"application/json;charset=UTF-8"})Map<String, Object> importZip(@RequestParam("file") MultipartFormDataInput file);
数组类型属性用大括号{}包起来,多个时候大括号中用逗号,隔开
4.返回类型
Response
在javax.ws.rs.core包下
readFile就是上边贴的第一段代码
public Response downloadZip(String cityId) {byte[] bytes = null;try {bytes = zipToBase64Util.readFile(cityId);} catch (Exception e) {throw new PlatRuntimeException(ErrorCodeConstant.downloadFileError, null, "文件读取出错");}String fileName = "documentation.rar";Response.ResponseBuilder response = Response.ok(bytes);response.header("Content-Disposition", "attachment; filename=\""+fileName+"\"");return response.build();}
5.Content-Disposition
Response.setStatus()//设置状态码
Response.ok 这是状态码为200
Response.ok我存base64字节是好用的 存stream测试无法返回报类型不符合 没有测试存FIle
content-disposition:服务器告诉客户端以什么方式打开响应体数据值In-line:默认值,在当前页面内打开Attachment;filename=xxx;以附件形式打开响应体,文件下载
如果filename文件名带中文,需要进行utf-8编码
6.请求http类型
想要浏览器直接下载,用的Get请求
参数直接放路径上
@GET@Produces("application/octet-stream")@Path("/downloadZip/{cityId}")Response downloadZip(@PathParam("cityId") String cityId);
7.追更
正常的RequestMapping接口下载
其实万变不离其中,都是要把文件流或者二进制字节码放在response中,只是RequestMapping是放在HttpServletResponse的response中
public void fileDownLoad(FileDownLoadRequest fileDownLoadRequest, HttpServletResponse response) {FileDownLoad fileDownLoad = fileDownRepository.fileDownLoad(FileDownLoad.builder().fileId(fileDownLoadRequest.getFileId()).build());OutputStream out = null;try {response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileDownLoad.getFileName().getBytes()));out = response.getOutputStream();out.write(fileDownLoad.getByteInput());out.flush();} catch (IOException e) {e.printStackTrace();}}
sofa接口下载文件相关推荐
- 2021-09-07-OSB学习(接口下载文件--流)
OSB学习(接口下载文件[流的形式]) 什么是使用流文件传输 1.我们要干什么 2.接口开发 2.1.控制台通过执行PL显示流文件信息 2.1.1.创建基本的目录结构 2.1.2.打开项目,然后创建B ...
- Vue项目:js模拟点击a标签下载文件并重命名,URL文件地址下载方法、请求接口下载文件方法总结。
URL文件地址下载方法 一.正常情况下,我们都如此下载文件并修改文件名,在a标签上面添加download属性 //文件下载downFile() {if ('download' in document. ...
- Python接口下载文件
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : shenqiang''' 注意:定义类的时候,内部方法之间的互调 步骤: 1.按照流 ...
- swagger knife4j 解决接口下载文件响应乱码问题
** 在@ApiOperation注解中加上produces = "application/octet-stream" ** 添加效果如图所示: @ApiOperation(val ...
- fegin接口下载文件
服务提供端这里结合的是minio文件服务器: controller,这里一定是void,不要指定返回内容 @RequestMapping("/file") @RestControl ...
- java restTemplate请求get接口下载文件
restTemplate调用模块进行文件下载: 调用的方法是void方法,所以需要用restTemplate.exchange方法进行调用 调用过程: 被调用的目标接口:@GetMapping(val ...
- 使用restTemplate请求get接口下载文件
引入的是这个包 import org.springframework.web.client.RestTemplate; // 通过接口,下载附件,转换成byte数组:然后再把这些字节流传递给XX系统的 ...
- java使用feign接口下载文件
1.feign接口定义(注意:Response 导包) import feign.Response; /*** 导出定义*/@PostMapping(value="/xx/export&qu ...
- swagger接口下载文件
注意!!!!!!!!!!!!swagger下载的文件是损坏的!!!!!!!!!! 所以在浏览器直接输入一下路径就能下载了
- 通过Java WebService接口从服务端下载文件
一. 前言 本文讲述如何通过webservice接口从服务器下载文件到客户端.适用于跨系统间的文件交互,传输文件不大的情况(控制在几百M以:):在这种情况下搭建一个FTP服务器增加了系统部署的复杂度和 ...
最新文章
- c# 使用线程方式实现消息订阅
- C++中的Lock简单用法
- 关于 form表单 嵌套问题的解决方案
- pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)--转载...
- (计算机组成原理)第二章数据的表示和运算-第三节1:浮点数的表示
- css设置自适应屏幕高度
- springboot-20-全局异常处理
- django基础入门(3)django中模板
- delphi 2010 mysql_Delphi2010 DBExpress+MySQL 程序的打包
- fedora linux五笔输入法,教你在Fedora 14 下安装五笔输入法
- 中图分类法----S 农业科学
- 济南市公安局交警支队辅警信息管理系统
- webgl天空盒边界缝隙_基于webGL技术的3D库ThingJS支持天空盒技术实现
- 华为OD机试(A、B卷)、机考,200分的题目整理如下,冲满分必备
- C# dll注入(指定进程注入指定dll)
- Sqoop常用命令回顾
- 【今日CV 计算机视觉论文速览 第128期】Mon, 10 Jun 2019
- Linux命令——groups
- 中英文标点符号在全角和半角之下的区分
- 2012年50款最佳iPhone应用