2016-08-28 11 views
2

htmlにバインドされたオブジェクトを含むフォームがng-bindです。同じフォームにfileuploadウィジェット:<input type="file" id="uploadedFile" name="uploadedFile">が含まれています。AngularからRestletへのファイルとJSONの送信

私はこれをJava Restletに送信します。私はrestletFileを取得できますが、私のオブジェクトを表すはずのjsonはnullです。これを解決する方法はありますか?

ここに私のコードです。 Restlet

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; 
} 

:角度側に

@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を取得する方法がわかりません。私はそれが要求のように思えるentityを印刷していた場合

Media type? multipart/form-data; boundary=----WebKitFormBoundary9GSUTgCJ4NbnnoT8 
FIELD = map: org.apache.commons.fi[email protected]54d1ffff 
FIELD = file: org.apache.commons.fi[email protected]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とファイルの両方を同じリクエストから取得するにはどうすればよいですか?

+0

Dunnoでも、マルチパートリクエストの最初の部分にある「[object Object]」は正しいですか? JSON関数との対話ではなく、JS側で.toStringが呼び出されたかのように見えます。 – Brian

+0

stringifyを使用しようとしましたが、何も変わりません。私はかなり地図上のオブジェクトを取得し、ファイルを取得するコードに渡すために、restlet側にコードの一部がないと確信しています。 – Eddy

+0

マップフォームデータのContent-Typeも表示されません。それがなければ、フレームワークはコンテンツを適切に推論することができません。 – Brian

答えて

0

jsonオブジェクトをクエリに送信し、restletに入れて、HttpServletRequestを使用して関連するパラメータを取得して解決しました。

$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側の他のすべてが正確である、これはangular側の変形例であり、問​​題のコードを見てみると

同じ。

関連する問題