获取上传文件的java作者

vom3gejh  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(465)

我正在试图找到一种方法来获取上传的excel文件的作者。单击“上载”按钮后,我只能看到“byte[]contents”,我很困惑,无法找到上载文件的作者。当我运行下面的代码时,我得到了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) {

                    }
9rbhqvlz

9rbhqvlz1#

主要有两种不同的类型 Microsoft Office 文件夹。旧二进制 OLE2 文件( *.xls , *.doc , *.ppt ,…)和更新的 Office Open XML ( OOXML )文件( *.xlsx , *.docx , *.pptx , ...).
为了 OLE2 属性位于 PropertySet 可以通过 PropertySetFactory . 但你需要正确使用它。这个 InputStream 用于 PropertySetFactory.create(java.io.InputStream stream) 不是注定要成为 InputStream 整个文件的一部分。我想一定是 DocumentInputStream . 更好的方法是使用 PropertySet.create(DirectoryEntry dir, java.lang.String name) . 参见下面的示例。
为了 OOXML 属性位于 PackageProperties 可以从 OPCPackage .
确定文件是否 OLE2 或者 OOXML ,可以使用filemagic。 FileMagic.valueOf(java.io.InputStream inp) 退货 FileMagic.OLE2 或者 FileMagic.OOXML 分别。
下面的示例演示如何让作者离开 PropertySetOLE2 文件和文件 PackagePropertiesOOXML 文件夹。这应该适用于各种 Microsoft Office 哪个 apache poi 支持。

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();

 }
}

相关问题