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?
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
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
Ich sehe auch nicht den Inhaltstyp Ihrer Kartenformdaten. Ohne es können Frameworks den Inhalt nicht richtig ableiten. – Brian