2016-04-21 92 views
-2

我正尝试使用AngularJS和REST(泽西岛)上传excel(.xlsx)文件。多部分边界被添加到REST收到的文件中,apache POI Library拒绝作为无效文件,但有以下例外情况。这个问题的解决方案是什么?REST上传Excel文件:使用多部分边界拒绝文件的POI库

org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13] 
    at org.apache.poi.util.PackageHelper.open(PackageHelper.java:39) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:254) 
    at com.bt.ngwfmt.framework.rest.FileUploadHandler.fileUpload(FileUploadHandler.java:128) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 

    Truncated. see log file for complete stacktrace 
Caused By: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13] 
    at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:203) 
    at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:673) 
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:274) 
    at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37) 
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:254) 
    Truncated. see log file for complete stacktrace 



    When I add @FormDataParam instead of @RequestParam I get the following exception 

    java.lang.NullPointerException 
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.unquoteMediaTypeParamete rs(MultiPartReaderClientSide.java:245) 
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:172) 
at com.sun.jersey.multipart.impl.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:80) 
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:158) 
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:85) 

与边界的InputStream为enter image description here

Java代码:

@POST 
@Path("/uploadFile") 

@Consumes(MediaType.MULTIPART_FORM_DATA) 

@NoCache 
public String fileUpload(@RequestParam("file") InputStream inputStream) { 

    XSSFWorkbook myWorkBook = null; 

    XSSFSheet mySheet; 

    try { 
     myWorkBook = new XSSFWorkbook(inputStream); //The exception is thrown at this line) 
    } catch (IOException e) { 
     logger.error("Cant open workbook", e); 
     e.printStackTrace(); 
    } 

.....

角片断:

angular.module(appName).controller('fileUploadController', 
    [ '$scope', 'fileUpload', function($scope, fileUpload) { 

     $scope.uploadFile = function() { 
      var file = $scope.myFile; 
      console.log('file is '); 
      console.dir(file); 
      var uploadUrl = "myurl"; 
      fileUpload.uploadFileToUrl(file, uploadUrl); 
     }; 

    } ]); 

angular.module(appName).directive('fileModel', [ '$parse', function($parse) { 
return { 
    restrict : 'A', 
    link : function(scope, element, attrs) { 
     var model = $parse(attrs.fileModel); 
     var modelSetter = model.assign; 

     element.bind('change', function() { 
      scope.$apply(function() { 
       modelSetter(scope, element[0].files[0]); 
      }); 
     }); 
    } 
}; 
} ]); 

angular 
    .module(appName) 
    .service(
      'fileUpload', 
      [ 
        '$http', 
        function($http) { 
         this.uploadFileToUrl = function(file, uploadUrl) { 
          var fd = new FormData(); 
          // 
          fd.append('file', file); 
          $http 
            .post(
              uploadUrl, 
              fd, 
              { 
               transformRequest :  angular.identity, 
               headers : { 
                'Content-Type' : "multipart/form-data" //"multipart/form-data" 
               } 
              }).success(function() { 
            }).error(function() { 
            }); 
         } 
        } ]); 

的问题是simil除了它特定于C#之外的其他链接。

https://salesforce.stackexchange.com/questions/42620/uploading-excel-file-as-rest-post-certain-content-types-corrupted-when-saved

+3

您应该可能将您的java代码添加到您的问题 – 2016-04-21 10:53:29

+0

这里是一个链接,显示如何使用Web服务上传文件...希望它可以帮助... http://howtodoinjava.com/jersey/jersey-file-upload - 例子/ – Abhishek

+1

@RC。嗨,我已经添加了所有的细节。这是我在stackoverflow上的第一个问题,对不起。 – user3187479

回答

1

注释应该是FormDataParam而不是RequestParam。如果仍然出现错误,请通过将其写入临时位置来验证您是否收到该文件。当文件内容为空时,您通常会遇到此错误,而这种情况在您的情况下更有可能。

+0

我正在获取边界后的数据,您可以在图像中看到它。我将文件在本地进行了批处理,并且验证了边界内的数据是相同的。 – user3187479

+0

在'fileUpload'方法中,您是否将文件写入临时位置,并且能够无误地打开文件?关于FormDataParam的错误,您使用的是哪一个Jersey版本?我看到https://java.net/jira/browse/JERSEY-1658。 – Adi

+0

我正在使用以下Jersey球罐。 jersey-bundle-1.19.jar jersey-core-1.19.jar jersey-multipart-1.19.jar – user3187479