问题描述
我正在尝试找到一种方法来获取上传的 Excel 文件的作者。单击“上传”按钮后,我只能看到“字节[] 内容”,我很困惑要找到一种方法来查找上传文件的作者。当我运行下面的代码时,我得到了 nopropertySetStreamException。
public static Map<String,Boolean> validateFileSize(MultipartActionRequest request,List<String> appCaseId) {
if (PortletFileUpload.isMultipartContent(request)) {
Map<String,List<multipartfile>> multipartfiles;
multipartfiles = request.getMultiFileMap();
if (multipartfiles != null && !multipartfiles.isEmpty()) {
for ( List<multipartfile> multipartfilesList : multipartfiles.values()) {
for ( multipartfile item : multipartfilesList) {
byte[] contents;
try {
contents = item.getBytes();
try {
Summaryinformation si = (Summaryinformation)
PropertySetFactory.create(item.getInputStream());
si.getLastAuthor();
} catch (nopropertySetStreamException e) {
// Todo Auto-generated catch block
e.printstacktrace();
} catch (MarkUnsupportedException e) {
// Todo Auto-generated catch block
e.printstacktrace();
} catch (UnsupportedEncodingException e) {
// Todo Auto-generated catch block
e.printstacktrace();
} catch (IOException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
} catch (IOException ioe) {
}
解决方法
主要有两种不同类型的 Microsoft Office
文件。旧的二进制 OLE2
文件 (*.xls
,*.doc
,*.ppt
,...) 和新的 Office Open XML
(OOXML
) 文件 ({ {1}}、*.xlsx
、*.docx
、...)。
对于 *.pptx
,属性在 OLE2
中,可以通过 PropertySet
获取。但是你需要正确使用它。 PropertySetFactory
中使用的 InputStream
并不是整个文件的 PropertySetFactory.create(java.io.InputStream stream)
。 Instad 它必须是一个 InputStream
。更好的方法是使用 DocumentInputStream
。请参阅下面的示例。
对于 PropertySet.create(DirectoryEntry dir,java.lang.String name)
,属性位于 OOXML
中,可以从 PackageProperties
中获取。
要确定文件是 OPCPackage
还是 OLE2
,可以使用 FileMagic。 OOXML
分别返回 FileMagic.valueOf(java.io.InputStream inp)
或 FileMagic.OLE2
。
以下示例显示如何将作者从 FileMagic.OOXML
文件的 PropertySet
和 OLE2
文件的 PackageProperties
中取出。这应该适用于 OOXML
支持的每种 Microsoft Office
。
apache poi