看文档下载网站源码分享错误,源代码下载文档

大家好,今天来为大家分享看文档下载网站源码分享错误的一些知识点,和源代码下载文档的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

前段时间有一个客户遇到了一件很奇怪的事情,他在使用程序解析一批word文件时,程序在运行一段时间后总是会自动中断,他查看了导致中断的word文档,发现也能正常打开,当他把文件另存为后,再运行程序发现程序就可以正常往下运行了。他感觉很奇怪,就找我来帮他分析一下原因。

一、问题分析(以下日志和代码均是重现问题后输出的)

首先登录服务器,找到程序的运行日志,打开当天运行的日志文件,查看是否有错误日志,果然发现了错误日志,具体内容如下:

java.lang.IllegalArgumentException:ThedocumentisreallyaOOXMLfile\natorg.apache.poi.hwpf.HWPFDocumentCore.verifyAndBuildPOIFS(HWPFDocumentCore.java:123)\natorg.apache.poi.hwpf.extractor.WordExtractor.<init>(WordExtractor.java:51)\natcom.file.util.readword.redWordText(Test.java:25)\natcom.file.util.readword.main(Test.java:77)\n

根据错误日志不难分析出是解析doc文件报错了,根据错误日志可以直接定位到错位代码所在位置,通过反编译工具可以查看它的源码,源码具体如下(看到下面的代码,小伙伴们是否确定了问题的原因了?):

publicstaticStringredWordText(StringfilePath){\nFilefile=newFile(filePath);\nStringfileName=file.getName();//获取文件名\nStringsuffix=fileName.substring(fileName.indexOf(&34;),fileName.length());//获取文件后缀\nStringtext=&34;;\nInputStreamis=null;\ntry{\nis=newFileInputStream(filePath);\nif(StringUtils.equals(suffix,&34;)){//解析doc文件\nWordExtractorex=newWordExtractor(is);\ntext=ex.getText();\nex.close();\n}elseif(StringUtils.equals(suffix,&34;)){//解析docx文件\nXWPFDocumentdoc=newXWPFDocument(is);\nXWPFWordExtractorextractor=newXWPFWordExtractor(doc);\ntext=extractor.getText();\nextractor.close();\n}\n}catch(Exceptione){\ne.printStackTrace();\n}finally{\nif(is!=null){\ntry{\nis.close();\n}catch(IOExceptione){\ne.printStackTrace();\n}\n}\n}\nreturntext;\n}\n

当我看到源码后,基本确定了问题出现的原因。

二、原因分析

客户收集上来的文件,渠道是多样的,有些docx文件的后缀被强制修改成了doc后缀,这些修改后的文件还是可以正常打开的。当使用StringUtils.equals(suffix,&34;)这种直接判断后缀的方式来判断文件类型是返回true的,导致docx文件使用了doc的解析方式,所以报错了。

三、解决办法

针对上面的问题可以使用FileMagic.valueOf(is)==FileMagic.OLE2来判断是否是doc格式文件,具体实现代码如下:

publicstaticStringredWordText1(StringfilePath){\nStringtext=&34;;\nInputStreamis=null;\ntry{\nis=newFileInputStream(filePath);\nif(FileMagic.valueOf(is)==FileMagic.OLE2){\nWordExtractorex=newWordExtractor(is);\ntext=ex.getText();\nex.close();\n}elseif(FileMagic.valueOf(is)==FileMagic.OOXML){\nXWPFDocumentdoc=newXWPFDocument(is);\nXWPFWordExtractorextractor=newXWPFWordExtractor(doc);\ntext=extractor.getText();\nextractor.close();\n}\n}catch(Exceptione){\ne.printStackTrace();\n}finally{\nif(is!=null){\ntry{\nis.close();\n}catch(IOExceptione){\ne.printStackTrace();\n}\n}\n}\nreturntext;\n}\n

四、其他存在的问题

当客户收集的文件的后缀被改成了大写,这种直接判断后缀的方法就无法判断了,需要在判断前把后缀统一成小写。

五、总结

通过上面的分析,小伙伴们以后判断word、excel文件格式时,一定要注意尽量避免直接使用后缀直接判断,推荐使用org.apache.poi.poifs.filesystem.FileMagic类进行判断(ps:专业的事情交给专业的来处理),否则一不小心就挖坑,导致后面的小伙伴又得加班填坑了。\u0002

关于看文档下载网站源码分享错误到此分享完毕,希望能帮助到您。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平