【发布时间】:2016-08-28 11:46:31
【问题描述】:
我有一个包含绑定到html 和ng-bind 的对象的表单。相同的表单包含一个fileupload 小部件:<input type="file" id="uploadedFile" name="uploadedFile">。
我将此提交给Java Restlet。我能够在restlet 中获得File,但应该代表我的对象的json 为空。有没有办法解决这个问题?
这是我的代码。在角度方面:
function saveMap2(map, fileToUpload) {
var formData = new FormData();
formData.append("map", map);
formData.append("file", fileToUpload);
var deferred = $q.defer();
$http.post(REST_SAVE_MAP_URI, formData, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
})
.then(
function (response) {
deferred.resolve(response.data);
},
function(errResponse) {
console.error('Error while saveMap');
deferred.reject(errResponse);
});
return deferred.promise;
}
Restlet 方面:
@Post
public Representation doPost(Representation entity) {
try {
System.out.println("Media type? " + entity.getMediaType());
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1000240);
RestletFileUpload upload = new RestletFileUpload(factory);
FileItemIterator fileIterator = upload.getItemIterator(entity);
while (fileIterator.hasNext()) {
FileItemStream fi = fileIterator.next();
String fieldName = fi.getFieldName();
String contentType = fi.getContentType();
System.out.println("FIELD = " + fieldName + ": " + fi);
if (!fi.isFormField()) {
String fileName = fi.getName();
System.out.println("name? " + fileName);
InputStream is = new BufferedInputStream(fi.openStream());
BufferedOutputStream output = null;
try {
output = new BufferedOutputStream(new FileOutputStream("/path/" + fileName, false));
int data = -1;
while ((data = is.read()) != -1) {
output.write(data);
}
} finally {
is.close();
output.close();
}
}
}
}
结果是我上传的图片保存正确,但是不知道怎么获取mapjson。
这里有一些输出:
Media type? multipart/form-data; boundary=----WebKitFormBoundary9GSUTgCJ4NbnnoT8
FIELD = map: org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl@54d1ffff
FIELD = file: org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl@5a160b15
name? IMG_5327.JPG
当我打印entity 时,请求似乎很好:
'------WebKitFormBoundarysmqftmsA0EFDlceo
Content-Disposition: form-data; name="map"
[object Object]
------WebKitFormBoundarysmqftmsA0EFDlceo
Content-Disposition: form-data; name="file"; filename="IMG_5327.JPG"
Content-Type: image/jpeg
知道如何解决这个问题吗?如何从同一个请求中同时获取 json 和文件?
【问题讨论】:
-
不知道,但您确定您的多部分请求的第一部分中的“[object Object]”是正确的吗?在我看来,好像 .toString 已在 JS 端调用,而不是与 JSON 函数的对话。
-
我尝试使用 stringify 但它没有任何改变。我很确定我在 restlet 端缺少一段代码来获取“地图”对象,然后将其传递给获取文件的代码。
-
我也没有看到您的地图表单数据的 Content-Type。没有它,框架就无法正确推断内容。
-
好吧,我在这里寻求帮助。请求(角度)端的代码应该允许发送 json 和文件。注意标题:{'Content-Type': undefined} 标题和它上面一行的转换函数。
-
如果你提供一个孤立的案例(一个完整的设置),我愿意仔细看看。
标签: java angularjs restlet restlet-2.0