Wie Spring MVC Dateiuploads behandelt, wird in der relevant section des Spring Reference Guide erläutert.
Wenn eine Anfrage eingeht, erreicht sie zuerst die DispatcherServlet
, sie erkennt, dass es sich um eine mehrteilige Anfrage handelt und delegiert die Anfrageverarbeitung an eine konfigurierte MultipartResolver
(die wiederum eine Schnittstelle ist). Die DispatcherServlet
erkennt diese MultipartResolver
durch einen bekannten Namen multipartResolver
(dies ist in der DispatcherServlet
Hardcoded).
Was diese MultipartResolver
Instanzen tun, ist die tatsächliche HttpServletRequest
in eine MultipartServletRequest
wickeln (was ein Spring MVC-Erweiterung auf die HttpServletRequest) and this wrapper knowns how to handle the incoming request and create the appropriate
MultipartFile` Implementierungen ist.
Frühling hat 3 Aromen dieser Schnittstelle
CommonsMultipartResolver
mit Apache Commons FileUpload
StandardServletMultipartResolver
Verwendung der Servlet 3.0 Standard-Servlet-API-Datei hochladen
MockMultipartFile
für Unit-Tests
Bei der Verwendung von Frühling Boot to handle file uploads es configures die zweite Option standardmäßig die StandardServletMultipartResolver
.
Wenn die komplexe Verarbeitung der mehrteiligen Anforderung abgeschlossen ist, gibt DispatcherServlet
die Anforderung an den ausgewählten Handler (d. H. An Ihren Controller) weiter. Die RequestMappingHandlerAdapter
prüft die ausgewählte Anforderungsbehandlungsmethode und füllt alle Methodenargumente aus.
Am Ende ist es die RequestParamMethodArgumentResolver
, die einen tatsächlichen Wert an das Objekt MultipartFile
bindet. Unter Verwendung der getFiles
Methode auf der MultipartServletRequest
. Für die Standard-Frühlings-Boot konfiguriert Implementierung (die StandardMultipartHttpServletRequest
), wird dies Instanzen StandardMultipartFile
geben, das ist eine eingebettete Klasse in dem StandardMultipartHttpServletRequest
Der Vorteil, dass die MultipartFile
Schnittstelle zu verwenden, ist, dass Sie CommonsMultipartResolver
ohne Änderungen ändern könnten Dein Controller.
Es gibt eine Instanz von etwas, das als "MultipartFile" betrachtet werden kann. Wenn es keine Instanz gäbe, wäre es für diesen Code buchstäblich unmöglich zu funktionieren. – Makoto
Kannst du Code Beispiel geben, ich verstehe nicht, in meiner Sicht verwenden wir Schnittstelle nur um Methoden zu beschreiben, die von anderen Klassen implementiert werden können –
Und Sie erhalten eine Implementierung dieser Schnittstelle injiziert. Abhängig davon, welchen Datei-Upload-Mechanismus Sie verwenden. Spring verwendet eine Vielzahl von Schnittstellen, um Sie von der eigentlichen Implementierung wegzulösen. –