在最近的一个项目中,遇到一个非常棘手的性能问题,场景是这样的:有PC端和手机端两个应用,用户在PC端上传的附件,如word,Excel,pdf等,当用户出差或不在电脑边上时,上传的附件在手机端能够打开预览。然后问题就来了,当在PC端上传的附件比较大,在手机端想要预览就比较慢,有时候甚至打不开,怎么解决这个性能问题呢?
一、多线程分段下载
分析:在预览的时候,将原文件切分成多分,使用多线程分段下载,这种方案可以快速的下载一个大文件到本地,然后直接打开预览,但是用户不同意将附件下载到手机上,因为手机内存有限,几个大附件就把内存占满了。
二、生成静态HTML文件
分析:在PC端上传附件的时候,启用异步线程,借助aspose组件,将附件转成成静态HTML文件,并放在单独的一个Tomcat下面,手机端预览附件的时候,直接访问这个Tomcat中的静态HTML,这样大大提升了预览速度,还不会占用手机内存,上传及预览的逻辑如下
转静态资源时,需要aspose组件的支持,因此需要在pom.xml中引入aspoxe相关组件
aspose
aspose.pdf
17.2.0
aspose
aspose-cells
17.3.0
aspose
aspose-slides
17.2-jdk16
aspose
aspose-words
17.3.0-jdk16
转静态HTML文件核心逻辑如下
package com.mairuan.common.utils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aspose.cells.Workbook;
import com.aspose.slides.Presentation;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import com.hrsj.mcc.base.system.service.IFileOperateService;
public class TransferToHtmlThread extends Thread{
private static final Logger logger = LoggerFactory.getLogger(TransferToHtmlThread.class);
private String sourceFileRoot;
private String htmlPathRoot;
private List
启异步线程将附件转成HTMl,核心逻辑如下
String tranFileType ="txt,xlsx,xls,docx,doc,pptx,ppt,zip,rar,img,jpg,pdf";
String filePath =/usr/mairuan/upload/";//PC端上传附件的存放路径
String tranFilePath ="/usr/mairuan/filepath/tran";//转换后静态资源文件的存放路径
List> fileList = fileOperateService.uploadFile(multiFile, filePath);
String fontPath = req.getSession().getServletContext().getRealPath("/fonts/");//PDF转出来在服务端预览时可能会出现乱码,需要一些字体支持
new Thread(new TransferToHtmlThread(filePath,tranFilePath,fileList,req,tranFileType,fontPath)).start();
部署一个空的Tomcat,在Tomcat的server.xml中配置静态资源文件存放根路径,手机端预览附件时,直接请求这个Tomcat提供的服务即可