很多曾经攻克过的难题都没有及时记录并分享,觉得有些可惜。趁着现在还单身,头还没秃,精力也还算旺盛,我便整理出一些自己曾经挑灯夜战、独立实现的还算有些成就感的项目需求,记录在个人博客上,希望能给拥有相同需求的同行提供一些参考。下面要说的这个需求,真的实现后,会发现其实并没有太多技术含量,分开来讲,也就两个步骤:(1)文件上传;(2)PDF转JPG。文件上传插件的使用没有太大的要求,只要能实现上传图片的功能就可以,关键是PDF转JPG的代码实现,博客上能找到很多相关的帖子,但并非都好用,下面分享的,是我亲测之后可以满足我项目需求的。
先说需求:由于网站的某个流程中,需要角色A的用户上传一个可能是JPG格式也可能是PDF格式的文件,然后希望角色B的用户可以在PC端、APP端和微信公众号端都能实时查看并下载这个文件到自己的设备上,并且要求这个文件在A4 纸上打印后的效果和原文件一样,能保证正常的使用。我的解决方案如下:
(1)首先对角色A的用户能够上传的文件格式进行前端限制,只允许上传JPG和PDF格式的文件(由于本身项目的特殊性,所以能够保证用户上传的该类文件一定是这两种格式中的一种)。
(2)对角色A的用户上传到服务器的文件进行后端校验并处理: ①如果是图片格式(JPG/PNG)的文件,就直接保存,并把保存后的图片路径返回给前端。 ②如果是PDF格式的文件,仍旧保存这个文件,然后得到这个PDF文件在我们服务器的硬盘上的路径,然后调用PDF转JPG的工具类进行转换,如果转换成功,返回转成功的图片的文件路径;如果失败,则返回给前端错误提示,要求传入正确的文件,因为能够确定,标准的文件是一定能够转换成成功的。③如果用户上传的文件不是这两种格式的(虽然前端做了校验,但难免有恶意请求进来的情况,所以永远不要过度相信前端传来的数据,尤其是涉及到敏感操作的时候),则不保存文件,程序结束并返回错误提示。
上传图片的插件有很多,我是使用FileUpload实现Servlet的文件上传,可参考这篇博客 https://blog.csdn.net/llkoio/article/details/78984466 来使用,此处就不花篇幅赘述。
下面直接上代码!!!
package fileupload;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.alibaba.fastjson.JSON;
import DateUtil;
import PdfToPngUtils;
/**
*
* @ClassName: PlUploadServlet
* @Description: TODO(这里用一句话描述这个类的作用)
* @author hqq
*
*/
public class PlUploadServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(PlUploadServlet.class);
public PlUploadServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletReq