在 Java 中获取上传文件作者

问题描述

我正在尝试找到一种方法获取上传的 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,可以使用 FileMagicOOXML 分别返回 FileMagic.valueOf(java.io.InputStream inp)FileMagic.OLE2

以下示例显示如何将作者从 FileMagic.OOXML 文件的 PropertySetOLE2 文件的 PackageProperties 中取出。这应该适用于 OOXML 支持的每种 Microsoft Office

apache poi