@RequestPart mit gemischten multipart-request, Spring MVC 3.2
Ich bin der Entwicklung eines RESTful service auf Basis von Spring 3.2. Ich bin mit einem problem konfrontiert, mit einem controller Verarbeitung von gemischten multipart-HTTP-Anforderung, mit einem Zweiten Teil mit XMLor JSON-formatierte Daten, und ein zweites Teil mit einer Image-Datei .
Ich bin mit @RequestPart annotation für den Erhalt der Anfrage
@RequestMapping(value = "/User/Image", method = RequestMethod.POST, consumes = {"multipart/mixed"},produces="applcation/json")
public
ResponseEntity<List<Map<String, String>>> createUser(
@RequestPart("file") MultipartFile file, @RequestPart(required=false) User user) {
System.out.println("file" + file);
System.out.println("user " + user);
System.out.println("received file with original filename: "
+ file.getOriginalFilename());
//List<MultipartFile> files = uploadForm.getFiles();
List<Map<String, String>> response = new ArrayList<Map<String, String>>();
Map<String, String> responseMap = new HashMap<String, String>();
List<String> fileNames = new ArrayList<String>();
if (null != file) {
//for (MultipartFile multipartFile : files) {
String fileName = file.getOriginalFilename();
fileNames.add(fileName);
try {
file.transferTo(new File("C:/" + file.getOriginalFilename()));
} catch (IllegalStateException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
responseMap.put("displayText", file.getOriginalFilename());
responseMap.put("fileSize", "" + file.getSize());
response.add(responseMap);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Accept", "application/json");
return new ResponseEntity<List<Map<String, String>>>(response,
httpHeaders, HttpStatus.OK);
}
User.java wird wie dieser-
@XmlRootElement(name = "User")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int userId;
private String name;
private String email;
private String company;
private String gender;
//getter setter of the data members
}
Meinem Verständnis, mit dem @RequestPart Anmerkung würde ich erwarten, dass die XML-multipart-Abschnitt ausgewertet werden, je nach Content-Type und schließlich un-gemarshallt in meiner User-Klasse (ich bin mit Jaxb2, die marshaller/unmarhaller richtig konfiguriert ist und in den Anwendungskontext und die Prozedur ist in Ordnung, für alle anderen controller-Methoden, wenn ich übergeben, die XML-Daten als Körper und verwenden Sie das @ - RequestBody annotation).
Aber was tatsächlich passiert, ist, dass, obwohl die Datei korrekt gefunden und analysiert, wie MultipartFile, die "Benutzer" - Teil nie gesehen, und die Anforderung wird immer scheitern, nicht in übereinstimmung mit der controller-Methode Signatur.
Ich reproduziert das problem mit einigen clients geben, und ich bin zuversichtlich, dass das format multipart Anfrage ist ok.
Mir bitte helfen, dieses Problem zu lösen, Vielleicht ein workaround sein, um zu empfangen mixed/multipart-request.
Dank und Grüße,
Raghvendra
- Hast du schon versucht mit
consumes = {"multipart/form-data"}
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht sicher, ob Sie hatte Ihr problem gelöst, aber ich hatte auch ein ähnliches problem, wo meine JSON-Objekt wurde nicht immer abgeholt von meinem controller beim mischen @RequestPart und MultipartFile zusammen.
Die Signatur der Methode für Ihren Anruf korrekt aussieht:
Aber stellen Sie sicher, dass Ihre Anfrage so aussieht:
Ich habe es geschafft das problem zu lösen
Endpunkt Beispiel:
Ausnahme:
Ausnahme geworfen wird, von der nächsten Methode:
Lösung:
Haben wir das erstellen von benutzerdefinierten Konverter @Komponente implementiert die HttpMessageConverter oder HttpMessageConverter und kennt MediaType.APPLICATION_OCTET_STREAM. Für einfache Abhilfe es ist genug, um verlängern AbstractJackson2HttpMessageConverter
Können Sie @RequestPart aus
org.springframework.web.binden.Anmerkung.RequestPart;
Es wird als Kombination von @RequestBody und Datei-upload.
Verwendung von @RequestParam wie diese
@RequestParam("Datei") Datei MultipartFile
Sie können nur upload-Datei und mehrere einzelne Daten (Schlüssel, Wert )
wie
veröffentlichen Sie JSON-Objekt-Daten und Datei sowohl mit der @RequestPart wie
Sind Sie nicht beschränkt auf die Verwendung von multipart-uploads direkt als controller die Parameter der Methode. Ihre Formular-Objekte enthalten können oder MultipartFile Felder, und im Frühjahr weiß automatisch, dass es muss, um die Werte aus der Datei Teile und setzt die Werte entsprechend.
Oben beschriebenen Methode kann eine Antwort auf die zuvor gezeigt multipart-request enthält eine einzige Datei. Dies funktioniert, weil die Feder hat einen integrierten HTTP-message converter erkennt, dass die Datei-Teile. Zusätzlich zu den javax.- servlet.http.Part-Typ, Sie können auch konvertieren Sie die Datei-uploads auf org.springframework.web.multipart.MultipartFile. Wenn das Feld Datei können mehrere Datei-uploads, wie gezeigt, in der zweiten multipart-request, einfach mit einem array oder einer Auflistung von Teilen oder MultipartFiles.
Glücklich Zu Helfen...
haben Sie versucht,
oder
Wenn das nicht funktioniert, können Sie uns zeigen
mapping.xml