Ich benutze ng-file-upload in Angular auf Client-Seite, um eine Datei (Bild, Text usw.) an Spring Boot-Anwendung zu senden.POST Anfrage mit mehrteiligen Daten im Frühjahr mvc
Ich habe Client-Seite in Xampp mit URL "Localhost" ausgeführt, während Spring-Instanz separat mit URL "Localhost: 8080" .Cors auf beiden Seiten aktiviert sind und alle anderen Anforderungen erfolgreich unterhalten werden.
Client Side-Code:
Upload.upload({
url: 'http://localhost:8080/file/upload',
method:'POST',
data: {
uploadedPicture: file,
uploadedFrom: 'recipe'
},
}).then(function(response) {
$timeout(function() {
$scope.result = response.data;
});
}, function(response) {
if (response.status > 0) $scope.errorMsg = response.status + ': ' + response.data;
}, function(evt) {
$scope.progress = parseInt(100.0 * evt.loaded/evt.total);
});
Server Side-Code:
@CrossOrigin
@RequestMapping(method = RequestMethod.POST, value = "/file/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
if (!file.isEmpty()) {
try {
Files.copy(file.getInputStream(), Paths.get(ROOT, file.getOriginalFilename()));
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded " + file.getOriginalFilename() + "!");
} catch (IOException|RuntimeException e) {
redirectAttributes.addFlashAttribute("message", "Failued to upload " + file.getOriginalFilename() + " => " + e.getMessage());
}
} else {
redirectAttributes.addFlashAttribute("message", "Failed to upload " + file.getOriginalFilename() + " because it was empty");
}
return "redirect:/";
}
ich die cors aus demselben Code Erhaltungs-Anforderungs versucht haben, mit get-Methode auf die gleiche Ressource durch das Senden der funktioniert. Aber wenn ich Post-Anfrage mit einem mehrteiligen Formular Daten (Bild oder eine andere Datei) senden, lehnt es die OPTIONS-Anfrage ab.
OPTIONS http://localhost:8080/file/upload
XMLHttpRequest cannot load http://localhost:8080/file/upload. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 403.
Ich habe diese Ressource von Postman auch getestet und es hochgeladen Datei ohne Fehler.
EDIT:Ich habe versucht, durch die http auf https ändern und es wird der Fehler als OPTIONS https://localhost:8080/file/upload net geben :: ERR_TIMED_OUT_ Problem gleiche ist, wie es nicht die erforderliche Ressource
irgendwelche Gedanken über diese finden Problem??
müssen Sie den 'Access-Control-Allow-Origin'-Header auf die serverseitige Antwort setzen. Vielleicht können Sie es tun, indem Sie der Annotation "@ CrossOrigin" entsprechende Parameter hinzufügen (die damit nicht vertraut sind). Die lustige Sache ist, in Bezug auf Cross-Herkunft, verschiedene Port (8080) wird als unterschiedliche Host (Ihre Anfrage scheint von Port 80 zu kommen) – JohnnyAW
Erstens, es ist ein Fall, dass die Anfrage von einem anderen Port ist.Es kann von einem sein andere System/Domäne, die in Zukunft der Fall sein wird. Zweitens habe ich versucht @ CrossOrigin (Ursprung = "http: // localhost"), aber das gleiche Problem.Und es ist nur mit POST-Anfrage GET funktioniert. –
wie ich schon sagte, wird der andere Port als eine andere Domäne für CORS betrachtet, deshalb brauchen Sie den 'Access-Control-Allow-Origin'-Header in der Antwort. Versuchen Sie "*" als Ursprung, um jeden Ursprung zuzulassen. Andernfalls könnten Sie diesen Header selbst hinzufügen. Übrigens. Sie erhalten 403 für Statuscode, überprüfen Sie Ihre Sicherheitseinstellungen, vielleicht benötigen Sie andere Berechtigungen für den Zugriff auf diese Ressource. – JohnnyAW