【问题标题】:REST Upload Excel file: POI library rejecting the file with Multipart Boundary [closed]REST上传Excel文件:POI库拒绝具有多部分边界的文件[关闭]
【发布时间】:2016-08-14 12:31:12
【问题描述】:

我正在尝试使用 AngularJS 和 REST (Jersey) 上传 excel (.xlsx) 文件。多部分边界被添加到 REST 中接收到的文件中,Apache 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)

带边界的输入流是

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

.....

角度 sn-p:

    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() {
                                    });
                        }
                    } ]);

该问题与以下链接中的问题类似,只是它特定于 C#。

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

【问题讨论】:

  • 您可能应该将您的 java 代码添加到您的问题中
  • 这里是一个显示如何使用网络服务上传文件的链接...希望对您有所帮助...howtodoinjava.com/jersey/jersey-file-upload-example
  • @RC。你好,我已经添加了所有的细节。这是我关于 stackoverflow 的第一个问题,抱歉。

标签: javascript java angularjs rest apache-poi


【解决方案1】:

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

【讨论】:

  • 我正在获取边界后的数据,你可以在图中看到。我在本地解析文件并验证边界内的数据相同。
  • 在 'fileUpload' 方法中,您是否将文件写入临时位置,并且能够无错误地打开它?关于 FormDataParam 的错误,您使用的是哪个版本的 Jersey?我看到 java.net/jira/browse/JERSEY-1658
  • 我正在使用以下泽西罐。 jersey-bundle-1.19.jar jersey-core-1.19.jar jersey-multipart-1.19.jar
猜你喜欢
  • 2018-01-26
  • 2013-02-19
  • 2020-10-18
  • 2013-10-08
  • 1970-01-01
  • 2013-07-02
  • 2021-08-22
  • 1970-01-01
  • 2016-04-23
相关资源
最近更新 更多