2016-08-28 6 views
2

html에 바인딩 된 객체가 포함 된 양식이 ng-bind입니다. 동일한 양식에는 fileupload 위젯이 포함됩니다 : <input type="file" id="uploadedFile" name="uploadedFile">.Angular에서 Restlet으로 파일 및 JSON 보내기

나는 이것을 Java Restlet에 제출할 예정입니다. restlet에서 File을 얻을 수 있지만 내 개체를 나타내야하는 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을 사용하고 관련 매개 변수를 가져 와서 해결했습니다. restletangular면이 정확하게 모두 다른

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

모든 :

$http.post(REST_SAVE_MAP_URI + "?map=" + JSON.stringify(map), formData, {... 

restlet에서이 질문의 코드를 보면

angular 쪽의 수정입니다 똑같다.