Java 将文件和JSON从Angular发送到Restlet
我有一个表单,其中包含一个对象,该对象通过Java 将文件和JSON从Angular发送到Restlet,java,angularjs,restlet,restlet-2.0,Java,Angularjs,Restlet,Restlet 2.0,我有一个表单,其中包含一个对象,该对象通过ng bind绑定到html。同一表单包括一个文件上传小部件: 我将这个提交给JavaRESTlet。我能够在restlet中获取文件,但是应该表示我的对象的json为空。有办法解决这个问题吗 这是我的密码。在角度方面: function saveMap2(map, fileToUpload) { var formData = new FormData(); formData.append("map", map); formDa
ng bind
绑定到html
。同一表单包括一个文件上传
小部件:
我将这个提交给JavaRESTlet
。我能够在restlet
中获取文件
,但是应该表示我的对象的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();
}
}
}
}
结果是,我上传的图像保存正确,但我不知道如何获取映射
json
以下是一些输出:
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
当我打印实体
时,请求似乎没有问题:
'------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和文件 我通过在查询中发送
json
对象,并使用HttpServletRequest
从restlet
中提取相关参数来解决它
查看问题中的代码这是角度
侧的修改:
$http.post(REST_SAVE_MAP_URI + "?map=" + JSON.stringify(map), formData, {...
在restlet
中:
org.restlet.Request restletRequest = getRequest();
HttpServletRequest servletRequest = ServletUtils.getRequest(restletRequest);
String mapJson = servletRequest.getParameter("map"));
Gson gson = new Gson();
Map map = gson.fromJson(servletRequest.getParameter("map"), Map.class);
restlet
和angular
侧的所有其他内容都完全相同 不知道,但是您确定多部分请求的第一部分中的“[object]”是正确的吗?在我看来,似乎在JS端调用了.toString,而不是在JSON函数的对话中调用。我尝试使用stringify,但它没有任何改变。我很确定我在restlet端缺少一段代码来获取“map”对象,然后将其传递给获取文件的代码。我也看不到地图表单数据的内容类型。没有it框架无法正确推断内容。好吧,我在这里寻求帮助。请求(角度)端的代码应该允许发送json和文件。注意标题:{'Content-Type':undefined}标题和上面一行的转换函数。