网站首页 > java教程 正文
之前文章中写过项目中实现pdf下载的需求(文章详见),开发、测试、以及验收的时候均没有问题,前段时间业务方说下载pdf的功能总是报超时错误,排查了下原因,原来是pdf中放的图片都是8M左右的,这肯定扛不住啊。问题发现了那就解决。思路有两个:
- 压缩图片
- 异步下载
1.压缩图片
这里使用Google开源的图片压缩库thumbnailator,这个工具简单易用,支持各种压缩方式,提供链式API,有兴趣的可以去研究下。
项目引入依赖:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
pfd渲染前,先把获取到的图片压缩,伪代码如下(源代码详见):
Lists.partition(imageUrls, BULK_SIZE).forEach(items -> {
FraudReportOrderEvidenceImage image = new FraudReportOrderEvidenceImage();
for (int i = 0; i < items.size(); i++) {
byte[] imageBytes = restTemplate.getForObject(items.get(i), byte[].class);
ByteArrayInputStream bais = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream baos = new ByteArrayOutputStream(BAOS_SIZE);
try {
//压缩图片
Thumbnails.of(bais).scale(IMAGE_SCALE_SIZE).toOutputStream(baos);
byte[] thumbnailBytes = baos.toByteArray();
if (i == 0) {
image.setReportDescImage(this.byte2String(thumbnailBytes));
continue;
}
if (i == 1) {
image.setReportDescImage2(this.byte2String(thumbnailBytes));
continue;
}
if (i == 2) {
image.setReportDescImage3(this.byte2String(thumbnailBytes));
continue;
}
if (i == 3) {
image.setReportDescImage4(this.byte2String(thumbnailBytes));
}
} catch (Exception e) {
log.error("压缩图片失败", e);
throw new ServiceResponseException("压缩图片失败");
}
}
images.add(image);
});
log.info("read {} images byte costs: {}ms", imageUrls.size(), System.currentTimeMillis() - start);
经过thumbnailator压缩之后,图片字节大大缩小,同时图片并没有失真模糊,在页面点击下载按钮,实时下载正常,不再超时
2.异步下载
实际上,下载文件在系统中一般都是非核心流程,所以大多数系统都是采用异步下载的方式,所谓异步下载是相对系统实时渲染数据给到前端供用户下载而言的,实现方式就是系统在业务低峰期(比如凌晨2点)通过job定时去获取指定的数据,生成相应的文件,然后上传到file server或者OSS服务器,上传成功后,系统库表中保留文件资源的地址。下载页面会把相应记录对应的文件地址返回给前端,用户下载的时候,前端直接通过地址url去download指定的文件即可,这样下载的处理就从业务系统中剥离出去,不会因为大文件的耗时处理影响业务系统性能。一般批处理系统、数仓、BI等都是以这种方式生成文件,供客户端下载。需要说明的是,此种方式下载,数据一般是T+1的,但由于是非核心功能,所以T+1是完全没问题的。
ps:
每张图片8M左右,压缩之后正常下载
猜你喜欢
- 2024-10-27 源码分享:在pdf上加盖电子签章(pdf文件上加盖电子印章)
- 2024-10-27 从腾讯T3-3大佬手上获得的Java架构进阶PDF文档,图文并茂,真香
- 2024-10-27 数据如何转成html表格、pdf、xmind文件格式下载?
- 2024-10-27 Java 给PDF文档设置有效时间(java word pdf)
- 2024-10-27 Spire.PDF for Java 8.9.1 增强了 PDF 到 Excel 和 PDFA3A 的转换
- 2024-10-27 Java | 调用打印机打印PDF文件(java调用打印机设备进行打印)
- 2024-10-27 「更新指南」Aspose.PDF for Java v19.5全新上线 | 附下载
- 2024-10-27 Java添加条形码到PDF表格(java条码打印)
- 2024-10-27 Spire.PDF for Java 8.10.1 增强了 PDF 到图片的转换
- 2024-10-27 iText7实现PDF电子签章(pdf 电子签)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)