对于页面预览用到了OpenOffice附件:
官方的下载地址:Apache OpenOffice
选择windows版本安装完成后,在cmd中执行下面两个命令,查看任务管理器中是否有soffice.bin的进程。(用到OpenOffice,必须保证任务管理器中有soffice.bin的进程)

cd  C:\Program Files (x86)\OpenOffice 4\programsoffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard



各别情况OpenOffice会杀掉自己的进程,所以也可以配置成Windows服务。
参考上一篇:OpenOffice注册windows服务
下面进行具体说明:
1.导入jar包:用gradle导入+本地jar导入:
gradle里配置如下:

(1.)OpenOffice转换jar:
compile(“org.jodconverter:jodconverter-core:4.2.0”)
compile(“org.openoffice:juh:4.1.2”)
compile(“org.openoffice:jurt:4.1.2”)
compile(“org.openoffice:ridl:4.1.2”)
compile(“org.openoffice:unoil:4.1.2”)
compile(“com.thoughtworks.xstream:xstream:1.4.10”)
//compile(“com.artofsolving:jodconverter:2.2.2”)
这些只需在gradle里写好依赖,直接远程下载包。
(2.)word文档转换pdf格式工具架包:jodconverter-2.2.2.jar
compile fileTree(dir:‘lib’,include:[’*.jar’])
解析:获取lib文件夹下所有jar包
jodconverter-2.2.2.jar下载:https://pan.baidu.com/s/1z0lWuX8spH8aVTo48NCVQw 密码:jndj
(找到lib文件夹下对应的jar)
这个远程下载如果有问题,就需要本地导入,在项目根路径下新建一个lib文件夹,将要导入的jar包拖进去,刷新gradle,显示下面图片表示成功。

2.文件上传数据库临时表(并保存本地)
a.建立临时表(log_file),存放文件信息。(这里用的表示之前项目用的,没做修改。)

b.建立对应实体类,Setter and Getter。
c.编写主要接口方法:

//文件上传数据库临时表
public LogFile upload(InputStream inputStream, String name, String fileType, String subType, String keyId, String fileSource, String userIdAndName) throws IOException;

d.编写实现类方法:
在程序中获取某个文件的绝对路径,@Value("${app.file.uploadPath:}")通过注解方式加载properties文件;在application.yml中配置文件路径,如图:

具体代码如下:

@Service
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public class FileServiceImpl extends BaseService implements FileService {@Value("${app.file.uploadPath:}")private String uploadPath;@Autowiredprivate LogFileDao logFileDao;@Override@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)public LogFile upload(InputStream inputStream, String name, String fileType, String subType, String keyId, String fileSource, String userIdAndName) throws IOException {// TODO: inputStream不能多次读取,因此先读出来// TODO: 下一步考虑是否从文件内容获取文件类型,而不是根据文件名byte[] bytes = FileUtil.read(inputStream);int fileSize = bytes.length;String md5 = DigestUtils.md5Hex(bytes);String sha1 = DigestUtils.sha1Hex(bytes);Example example = new Example(LogFile.class);example.createCriteria().andEqualTo("fileMd5", md5);List<LogFile> list = logFileDao.selectByExample(example);String sign = md5;if (list != null) {if(list.size()  == 1){// 存在md5相同的记录,需要判断signLogFile savedFile = list.get(0);//判断服务器目录下是否有文件,数据库中有上传记录,但实际服务器目录无文件,读取文件时无法找到文件,无实际意义File file  =  new File(savedFile.getFilePath()+savedFile.getFileName());if (savedFile.getFileSha1() != null && savedFile.getFileSha1().equals(sha1) && savedFile.getFileSize() != null && savedFile.getFileSize() == fileSize) {savedFile.setFilePath("******");//如果文件不存在,可以上传文件  if(!file.exists()){FileUtil.save(bytes, new FileOutputStream(savedFile.getFilePath()+savedFile.getFileName()));}return savedFile;}sign = md5 + sha1 + DigestUtils.md5Hex(String.valueOf(fileSize));//如果出现多条的情况,直接清空表md5相同的日志记录,后面重新插入}else{logFileDao.deleteByExample(example);}}String extName = name.substring(name.lastIndexOf(".") + 1);String fileName = StringUtil.guid() + "." + extName;String filePath = FileUtil.filePath(uploadPath);// inputStream上面读取后,不能直接用FileUtil.save(bytes, new FileOutputStream(filePath + fileName));LogFile logFile = new LogFile();logFile.setFileId(StringUtil.guid());logFile.setFileType(fileType);logFile.setSubType(subType);logFile.setKeyId(keyId);logFile.setFileName(fileName);logFile.setOriginName(name);logFile.setFilePath(filePath);// fileDescribelogFile.setExtName(extName);// extTypelogFile.setFileSize(fileSize);// thumbNamelogFile.setImageWidth(0);logFile.setImageHeight(0);logFile.setFileMd5(md5);logFile.setFileSha1(sha1);logFile.setFileSign(sign);logFile.setFileSource(fileSource);// deleteTime// deleteUserlogFile.setFileState("0000");// areaCode// appCodelogFile.setManageTime(DateUtil.getDateDate());logFile.setManageUser(userIdAndName);//将文件信息插入log_file临时表logFileDao.insert(logFile);// 隐藏文件路径logFile.setFilePath("******");return logFile;}}

e.编写控制器类:

@RequestMapping(value="/upload", method = RequestMethod.POST)public LogFile upload(@RequestParam(name = "name") String name, @RequestParam(name = "fileType", required = false) String fileType, @RequestParam(name = "subType", required = false) String subType,@RequestParam(name = "keyId", required = false) String keyId, @RequestParam(name = "fileSource", required = false) String fileSource, HttpServletRequest httpServletRequest) throws IOException {return fileService.upload(httpServletRequest.getInputStream(), name, fileType, subType, keyId, fileSource, super.getUserIdAndName());}

以上文件上传逻辑完成:
e-1:整个逻辑应用了文件流,用MD5对fileId、filesign等进行加密。涉及了一个简单查询,一个删除接口上面没有完全体现。(每次上传文件是存到临时表,上传前会判断文件是否存在,如果出现多条的情况,直接清空表md5相同的日志记录,后面重新插入)
e-2:文件保存数据库同时,会在application.yml配置的文件路径下生成对应文件。

3.上传数据库表(并保存本地,与上同路径),word转pdf
a.建立数据库表Test

b.建立对应实体类,Setter and Getter。
c.编写主要接口方法:

//上传文件到数据库表
void worldImport(Test test);

d.编写接口实现类方法:

public class TestServiceImpl extends BaseService implements TestService{@Autowiredprivate TestDao testDao;@Overridepublic void worldImport(Test test) {testDao.insertNotNull(test);}
}

e.编写word转pdf工具类:

public class OpenOfficeUtil {public static String wordToPDF(String filePath,String fileName){File docFile = new File(filePath+fileName);File pdfFile = null;if (fileName.contains(".")){pdfFile = new File(filePath+fileName.substring(0,fileName.indexOf("."))+"pdf.pdf");}else {pdfFile = new File(filePath+fileName+"pdf.pdf");}String pdfFilePath = pdfFile.getPath();if (docFile.exists()){if (!pdfFile.exists()){OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);try {connection.connect();DocumentConverter converter = new OpenOfficeDocumentConverter(connection);converter.convert(docFile,pdfFile);connection.disconnect();} catch (ConnectException e) {e.printStackTrace();}}else {throw new RuntimeException("该文件已经转换过了!");}}else {throw new RuntimeException("需要转换的文件不存在!");}return pdfFilePath;}
}

f.编写控制器类:

@RequestMapping(value = "/worldImport",method = RequestMethod.POST)public void worldImport(@RequestBody String  fileSign) throws IOException, InvalidFormatException, SAXException {if(StringUtils.isEmpty(fileSign)){return;}LogFile logFile =  fileService.selectBySign(fileSign);if(logFile == null){return;}//将Word文档转化为PDF文档String pdfFilePath = OpenOfficeUtil.wordToPDF(logFile.getFilePath(),logFile.getFileName());System.err.println(pdfFilePath);FileInputStream fileInputStream = new FileInputStream(pdfFilePath);byte[] content = new byte[fileInputStream.available()];fileInputStream.read(content);Test test = new Test();test.setTest(content);testServiceImpl.worldImport(test);fileInputStream.close();}

以上文件上传、word转pdf逻辑完成:
实现:通过调用临时表log_file信息(路径+名字),将需要转换的word文件转换成pdf文件,转格式存放在数据库表test中,同时在本地生成对应pdf文件。
4.对pdf文件进行预览
a.编写接口方法:

List<Test> world();

b.编写实现类方法:

@Overridepublic List<Test> world() {return testDao.selectAll();}

c.编写控制器类:

@RequestMapping(value = "/world",method = RequestMethod.GET)public void world(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {List<Test> tests = testServiceImpl.world();//具体需求具体判断,此处获取的是数据库第六条数据的文件信息。byte[] result = tests.get(7).getTest();ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();if (servletOutputStream != null && result != null){httpServletResponse.setContentType("application/pdf");httpServletResponse.setContentLength(result.length);httpServletResponse.setHeader("Expires","0");httpServletResponse.setHeader("Cache-Control","must-revalidate,post-check=0,pre-check=0");httpServletResponse.setHeader("Pragma","public");servletOutputStream.write(result);servletOutputStream.flush();servletOutputStream.close();}}

以上整个逻辑完成,主要参考代码如上,部分工具类下篇总结。页面展示如下:

Java文件上传数据库(并保存本地)、word转pdf并进行页面预览相关推荐

  1. java文件上传到云服务器,java文件上传到云服务器

    java文件上传到云服务器 内容精选 换一换 当用户拥有Linux操作系统的外部镜像文件,且类型及操作系统符合外部镜像文件格式和操作系统类型要求时,用户可以将外部镜像文件创建为Linux系统盘镜像. ...

  2. Java 文件上传 MultipartFile与ServletFileUpload

    JAVA文件上传 ServletFileUpload 参考这个:https://www.cnblogs.com/liuyangv/p/8298997.html Java文件上传 MultipartFi ...

  3. JAVA文件上传详解(附源码)

    文章目录 JAVA文件上传详解(附源码) 1.准备工作 2.使用类介绍 FileItem类 ServletFileUpload类 3.代码编写 JAVA文件上传详解(附源码) 在web应用中,文件上传 ...

  4. Java文件上传下载

    文件上传下载 Java文件上传和下载对于刚接触Java没多久的老铁们来说可能是一个技术难点.如果看过我前两篇文章的老铁肯定就知道,这次肯定又是一个工具类,废话少说我们直接附上代码. package c ...

  5. Java文件上传细讲,大厂 HR 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 什么 ...

  6. JAVA文件上传 ServletFileUpLoad 实例

    1.  jsp <%@ page language="java" contentType="text/html" pageEncoding="u ...

  7. java文件上传_Java文件上传细讲

    什么是文件上传? 文件上传就是把用户的信息保存起来. 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片.那么这张照片就应该要进行保存. 上传组件(工具) 为什么我们要使用上传工具? 为啥我 ...

  8. java 文件上传 servlet_java文件上传-原始的Servlet方式

    前言: 干了这几个项目,也做过几次文件上传下载,要么是copy项目以前的代码,要么是百度的,虽然做出来了,但学习一下原理弄透彻还是很有必要的.刚出去转了一圈看周围有没有租房的,在北京出去找房子是心里感 ...

  9. 使用饿了么update组件 实现多文件上传到后台以及本地图片显示功能

    使用饿了么update组件 实现多文件上传到后台以及本地图片显示功能 查了很多博客,终于弄出来了.我就大概说一下.我的业务内容是要把一个表单统一上传上去,而且其中有字段也有图片. <div cl ...

  10. Java文件上传大杀器-绕waf(针对commons-fileupload组件)

    Java文件上传大杀器-绕waf(针对commons-fileupload组件) Ps:高版本才有1.3以上 来个中二的标题,哈哈哈,灵感来源于昨晚赛博群有个师傅@我是killer发了篇新文章,在那篇 ...

最新文章

  1. java numberutil_NumberUtil
  2. Python工程目录组织
  3. springBoot+maven的打包和部署在Tomcat
  4. leetcode 1143. Longest Common Subsequence | 1143. 最长公共子序列(动态规划,暴力递归->傻缓存->dp)
  5. java 读取properties文件
  6. orm对象关系映射演练 一行就是一个对象
  7. IDEA社区版找不到tomcat
  8. 超越cookie - 使用DOM sessionStorage和localStorage来保存更多信
  9. Hive 开窗必需掌握的rankdense_rankrow_number
  10. 女生体寒的·手脚冰凉的都来看了(男的替老婆收着)
  11. 电商项目的app学习笔记(一)---webpack相关配置
  12. 分享java50道基础面试题(有答案)
  13. c# u盘使用记录_用 C# 编写 USB 存储设备使用痕迹检测和删除工具
  14. Word怎么转PDF?分享三种非常简单的方法
  15. Java开发基础知识学习总结之(上)-王者笔记建议收藏
  16. PLSQL连接Oracle11g64位操作步骤
  17. EMC 2 完美的EMC电路设计攻略之:元器件选型(上)
  18. 掩码、反掩码和通配符
  19. 第一个开源项目---halcon图像显示控件(缩放/roi操作)
  20. python实践3——利用爬虫爬取“广州各大行业微信群二维码信息”及存入数据到MySQL数据库

热门文章

  1. Task04 Python操作PDF
  2. 零基础快速学会用spss分析问卷
  3. 联想换机助手_三星s换机助手下载-三星S换机助手 安卓版v3.6.07.11-pc6手机下载
  4. 《工业设计史》 第三章:18世纪的设计与商业
  5. 主动轮廓模型snake
  6. 华表Cell应用 - 使用XML自动读入数据 | #报表 #华表Cell
  7. python怎么画地图空间分异图_中国西南诸河流域东片土壤、植被生态系统的分异...
  8. 安装虚拟机提示未能启用服务器,win7系统共享虚拟机提示VMware Workstation Server共享服务不能启动的解决方法...
  9. 微型计算机原理与接口技术课后答案,微机原理与接口技术-课后习题答案
  10. BP神经网络及其学习算法