7
回答
文件转为流并返回数据
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   

大家好,有这样一个场景,web项目,前台请求数据后台生成一个pdf文件,返回给前台的是一个json数据,能不能把生成的pdf文件转化为流并存储在返回的json中,比如:

{

name:xxx.pdf,

file:pdf流

}

这样是可以的吧??

<无标签>
举报
樱木花道VS康
发帖于2个月前 7回/242阅

不能,因为JSON(非BSON)只是字符流,PDF 文件数据是二进制,你如果把这些二进制数据编码成Base64,将会变得超级大,开销太大了。

不如这样,file 返回一个下载文件的URL吧。

{

  name: "xxx.pdf",

  file: 'http://example.com/file/xxx.pdf?key=asdfg'

}

 

--- 共有 5 条评论 ---
蓝水晶飞机 回复 @xinqingxiangyue : SO,我也是没转过弯来,被楼主的想法固定了思维。 2个月前 回复
蓝水晶飞机 回复 @xinqingxiangyue : 啧啧~~~你倒是说出了另一个办法啊!那么就返回字节数据流,定义前512字节做文件名数据空间(固定长度,文件名结尾\n),后面紧跟就是PDF数据。 2个月前 回复
xinqingxiangyue 回复 @樱木花道VS康 : 对方技术菜,他自己不知道,这种需求烂。 你请求给个参数,他自己传,要不返回json 文本流,要不返回pdf 二进制流 2个月前 回复
蓝水晶飞机 回复 @樱木花道VS康 : 不知道怎么回答好。1MB的PDF 2次请求流量耗费在1.1MB以内,而你非要塞到一个JSON里面(采用Base64编码PDF数据)那么可能需要2MB以上。如果是考虑到用户的感受,那么节省流量是最实在的。 2个月前 回复
樱木花道VS康哎,您好,我们现在做微服务(我也刚入职这几公司),需求是这样,对方发送请求我们做后台接口,我已经实现返回pdf访问地址了,像您json格式那样,对方说如果这样的话就会访问两次,一次请求得到url访问路径,再一次请求得到pdf文件,他想能不能一次请求得到所有,,, 2个月前 回复

如果一定要这么做只能把pdf的文件流转成16进制字符附在json里面,pdf的格式就算用zip压缩也不会减少多少的。

json倒没明确的大小限制,只是这样的接口响应会超慢。

那你给他返回multipart/mixed ,让他装。

好人做到底,给你写个demo:

	@RequestMapping("test")
	@ResponseBody
	public void test111(HttpServletRequest request, HttpServletResponse response) throws Exception {
		Multipart parts = new MimeMultipart();
		BodyPart part1 = new MimeBodyPart();
		part1.setText("这些一些文字信息");
		part1.setHeader("ContentType", "text/plain;charset=UTF-8");
		parts.addBodyPart(part1);
		
		BodyPart part2 = new MimeBodyPart();
		part2.setHeader("ContentType", "application/pdf");
		DataSource ds=new FileDataSource(new File("/Users/pollyduan/git/myJournal/applemac/keka.pdf"));
		part2.setFileName(ds.getName());
		part2.setDataHandler(new DataHandler(ds));
		parts.addBodyPart(part2);
		
		parts.writeTo(response.getOutputStream());

	}

 

--- 共有 2 条评论 ---
polly 回复 @蓝水晶飞机 : 没错,上传文件就是multipart类型。他如果需要你传递文本的同时传递二进制文件,这样完全满足,企业级的需求据我所知,mm7就是这种报文。 他都不管你麻不麻烦,你倒是关心他麻不麻烦 :) 2个月前 回复
蓝水晶飞机没用过。看起来这种好像封装一个HTML Form的形式啊,客户端如何处理呢? 2个月前 回复
顶部