【问题标题】:Sending File and JSON from Angular to Restlet将文件和 JSON 从 Angular 发送到 Restlet
【发布时间】:2016-08-28 11:46:31
【问题描述】:

我有一个包含绑定到htmlng-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


【解决方案1】:

我通过在查询中发送json 对象来解决它,并通过使用HttpServletRequest 将其放入restlet 并从中提取相关参数。

查看问题中的代码这是angular侧的修改:

$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);

restletangular 方面的其他所有内容完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 2022-01-19
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2020-05-29
    相关资源
    最近更新 更多