【问题标题】:Get uploading file author in Java在 Java 中获取上传文件作者
【发布时间】:2021-05-13 16:46:59
【问题描述】:

我正在尝试找到一种方法来获取上传的 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) {
                        
                    }

【问题讨论】:

  • 这是一个较旧但可能很有帮助的答案:stackoverflow.com/questions/12861054/…
  • 上传了什么样的Excel文件? PropertySetFactory 仅适用于旧的二进制 BIFF 格式 (*.xls)。当前的Offiice Open XML-Format (*.xlsx) 有POIXMLProperties
  • @Alex - 我正在尝试上传 *.xlsx 文件

标签: java excel spring apache-poi portlet


【解决方案1】:

Microsoft Office 文件主要有两种不同的类型。旧的二进制文件OLE2 文件(*.xls*.doc*.ppt、...)和较新的Office Open XMLOOXML)文件(*.xlsx*.docx*.pptx、...) ..)。

对于OLE2,属性位于PropertySet,可以通过PropertySetFactory 获得。但是你需要正确使用它。 PropertySetFactory.create(java.io.InputStream stream) 中使用的InputStream 并不意味着是整个文件的InputStream。 Instad 必须是DocumentInputStream。更好的方法是使用PropertySet.create(DirectoryEntry dir, java.lang.String name)。请参阅下面的示例。

对于OOXML,属性位于PackageProperties,可以从OPCPackage获取。

要确定文件是OLE2 还是OOXML,可以使用FileMagicFileMagic.valueOf(java.io.InputStream inp) 分别返回 FileMagic.OLE2FileMagic.OOXML

以下示例显示如何将作者从OLE2 文件中的PropertySetOOXML 文件中的PackageProperties 中取出。这应该适用于apache poi 支持的每种Microsoft Office

import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;

import org.apache.poi.poifs.filesystem.FileMagic;

import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.hpsf.PropertySetFactory;
import org.apache.poi.hpsf.PropertySet;
import org.apache.poi.hpsf.SummaryInformation;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageProperties;

public class GetAuthor {

 static String getAuthor(InputStream is) throws Exception {

  String author = null;

System.out.println(FileMagic.valueOf(is));
  if (FileMagic.valueOf(is) == FileMagic.OLE2) {
   POIFSFileSystem fs = new POIFSFileSystem(is);
   PropertySet props = PropertySetFactory.create(fs.getRoot(), SummaryInformation.DEFAULT_STREAM_NAME);
   if (props instanceof SummaryInformation) {
    SummaryInformation sumInf = (SummaryInformation) props;
    author = sumInf.getAuthor();
   } 
  } else if(FileMagic.valueOf(is) == FileMagic.OOXML) {
   OPCPackage pckg = OPCPackage.open(is);
   PackageProperties props = pckg.getPackageProperties();
   author =  props.getCreatorProperty().get();
  }

  return author;

 }

 public static void main(String[] args) throws Exception {

  String author = null;

  InputStream is = new BufferedInputStream(new FileInputStream("./Excel.xls"));
  author = getAuthor(is);
System.out.println(author);
  is.close();

  is = new BufferedInputStream(new FileInputStream("./Excel.xlsx"));
  author = getAuthor(is);
System.out.println(author);
  is.close();

 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多