网站首页 > 技术文章 正文
之前文章中写过项目中实现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-23 从腾讯T3-3大佬手上获得的Java架构进阶PDF文档,图文并茂,真香
- 2024-10-23 数据如何转成html表格、pdf、xmind文件格式下载?
- 2024-10-23 Java 给PDF文档设置有效时间 java pdfwriter
- 2024-10-23 Spire.PDF for Java 8.9.1 增强了 PDF 到 Excel 和 PDFA3A 的转换
- 2024-10-23 Java | 调用打印机打印PDF文件 java调用打印机打印pdf文件
- 2024-10-23 「更新指南」Aspose.PDF for Java v19.5全新上线 | 附下载
- 2024-10-23 Java添加条形码到PDF表格 条形码生成api
- 2024-10-23 Spire.PDF for Java 8.10.1 增强了 PDF 到图片的转换
- 2024-10-23 iText7实现PDF电子签章 java pdf电子签章
- 2024-10-23 Spire.PDF for Java 5.5.0 增强了 PDF 到 Word 以及 PDF 到图片的转换功能
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)