Przetestowałem kod z prostym wiosennym backend i działa prawidłowo:
@Controller
public class FileController {
@ResponseBody
@RequestMapping(value = "/data/fileupload", method = RequestMethod.POST)
public String postFile(@RequestParam(value="file", required=false) MultipartFile file,
@RequestParam(value="data") Object data) throws Exception {
System.out.println("data = " + data);
return "OK!";
}
}
Użyłem kodu po stronie klienta z kątowym v1.1.5:
var test = {
description:"Test",
status: "REJECTED"
};
var fd = new FormData();
fd.append('data', angular.toJson(test));
//remove comment to append a file to the request
//var oBlob = new Blob(['test'], { type: "text/plain"});
//fd.append("file", oBlob,'test.txt');
return $http.post('/data/fileupload', fd, {
transformRequest: angular.identity,
headers: {
'Content-Type': undefined
}
});
Żądanie wygląda następująco (skopiowane z karty sieciowej konsoli Chrome):
Request URL:http://localhost:8080/data/fileupload
Request Method:POST
Status Code:200 OK
Request Headers
POST /data/fileupload HTTP/1.1
Host: localhost:8080
...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryEGiRWBFzWY6xwelb
Referer: http://localhost:8080/
...
Request Payload
------WebKitFormBoundaryEGiRWBFzWY6xwelb
Content-Disposition: form-data; name="data"
{"description":"Test","status":"REJECTED"}
------WebKitFormBoundaryEGiRWBFzWY6xwelb--
Odpowiedź 200 OK, a konsola wyprowadza oczekiwane: {"description":"Test","status":"REJECTED"}
Tylko po to, aby wysłać jedno żądanie zarówno do zakodowanego pliku _i_ treści JSON? Czy możesz wyjaśnić przepływ, który chcesz uzyskać? –
@Benjamin Gruenbaum: Tak, to prawda, wszystko w jednym wniosku. Utworzono backend Java Spring, który wymaga części JSON, która jest wymagana, oraz części pliku, która jest opcjonalna. Mam formularz, w którym użytkownik wprowadza dane, model jest następnie konwertowany na Json przez angular.toJson (..), a następnie chcę to opublikować. Użytkownik może również przesłać plik w tym samym formularzu. – LuckyLuke
Hmmm, to może być trochę pracy lub dużo tego, jakie przeglądarki musisz obsługiwać? –