【发布时间】: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#。
【问题讨论】:
-
您可能应该将您的 java 代码添加到您的问题中
-
这里是一个显示如何使用网络服务上传文件的链接...希望对您有所帮助...howtodoinjava.com/jersey/jersey-file-upload-example
-
@RC。你好,我已经添加了所有的细节。这是我关于 stackoverflow 的第一个问题,抱歉。
标签: javascript java angularjs rest apache-poi