Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将文件和JSON从Angular发送到Restlet_Java_Angularjs_Restlet_Restlet 2.0 - Fatal编程技术网

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}标题和上面一行的转换函数。