2016-08-28 1 views
2

Ich habe ein Formular, das ein Objekt enthält, das an html mit ng-bind gebunden ist. Das gleiche Formular enthält ein fileupload Widget: <input type="file" id="uploadedFile" name="uploadedFile">.Senden von Datei und JSON von Angular nach Restlet

Ich reiche dies an eine Java Restlet. Ich bin in der Lage, die File in der restlet zu bekommen, aber die json, die mein Objekt darstellen sollte, ist null. Gibt es eine Möglichkeit, dies zu lösen?

Hier ist mein Code. Auf der Winkelseite:

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

Auf der Restlet Seite:

@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(); 
        } 
       } 
     } 
    } 

Das Ergebnis ist, dass das Bild, das ich das Hochladen bin richtig gespeichert, aber ich weiß nicht, wie die map zu bekommen json .

Hier einige Ausgabe:

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 

Als ich die entity es wie die Anforderung scheint Druck bin in Ordnung ist:

'------WebKitFormBoundarysmqftmsA0EFDlceo 
Content-Disposition: form-data; name="map" 

[object Object] 
------WebKitFormBoundarysmqftmsA0EFDlceo 
Content-Disposition: form-data; name="file"; filename="IMG_5327.JPG" 
Content-Type: image/jpeg 

Jede Idee, wie dieses Problem zu lösen? Wie bekomme ich sowohl den JSON als auch die Datei von derselben Anfrage?

+0

Weiß nicht, aber sind Sie sicher, dass das "[object Object]" im ersten Teil Ihrer mehrteiligen Anfrage korrekt ist? Sieht für mich so aus, als ob .toString auf der JS-Seite statt der Konversation zur JSON-Funktion aufgerufen wurde. – Brian

+0

Ich habe versucht, stringify zu verwenden, aber es ändert nichts. Ich bin mir ziemlich sicher, dass mir ein Stück Code auf der Restlet-Seite fehlt, um das 'map'-Objekt zu erhalten und es dann an den Code zu übergeben, der die Datei abruft. – Eddy

+0

Ich sehe auch nicht den Inhaltstyp Ihrer Kartenformdaten. Ohne es können Frameworks den Inhalt nicht richtig ableiten. – Brian

Antwort

0

Ich löste es durch Senden der json Objekt in der Abfrage, und bekommen es in der restlet mit der HttpServletRequest und ziehen Sie die relevanten Parameter daraus.

auf den Code in der Frage ist dieser Blick die Änderung auf der angular Seite:

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

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

Alles andere sowohl auf der restlet und angular Seite ist genau das, das Gleiche.

Verwandte Themen