Vor kurzem fragte mich mein Kollege, ob ich E-Books über Technologie habe. Ich habe die kleine Bibliothek auf meinem Computer geöffnet, aber die E -Mail war zu groß, um ihn zu senden, und das Unternehmen verbot die Freigabe mit Ordnern. Deshalb habe ich einen halben Tag damit verbracht, ein kleines Datei -Upload -Programm zu schreiben und sie auf meinem Linux -Computer bereitzustellen.
Funktionen angeben: 1. Datei -Hochladen 2. Dateiliste Anzeige und herunterladen
Das ursprüngliche hochgeladene Stück ist hässlich. Ich habe einen JS -Code geschrieben, um ihn zu optimieren. Die endgültige Schnittstelle wird wie folgt angezeigt:
Geben Sie zunächst die Ergebnisse an und zeigt, wie sie Schritt für Schritt implementieren können.
1. Erstellen Sie ein neues Projekt
Das erste ist, ein neues Spring-Boot-Projekt zu erstellen. Sie können ein Projekt auf der Website initialisieren oder die Spring Initialier -Funktion der IDE nutzen und ein neues Projekt erstellen. Hier erstelle ich ein neues Projekt aus der Idee:
Geben Sie als nächstes Gruppen- und Artefakt ein und klicken Sie weiter auf Weiter:
Zu diesem Zeitpunkt wird diese Modulauswahlschnittstelle angezeigt. Klicken Sie auf die Weboption und überprüfen Sie das Web, um zu beweisen, dass es sich um ein WebApp handelt. Klicken Sie dann auf Vorlagenmotoren, um die Front-End-Vorlagemotor auszuwählen. Wir wählen Thymleaf. Spring-Boot-Beamter empfiehlt auch, diese Vorlage anstelle von JSP zu verwenden.
Warten Sie den letzten Schritt und warten Sie, bis das Projekt erfolgreich initialisiert wird.
2.POM -Einstellungen
Überprüfen Sie zunächst, welche Abhängigkeiten Sie dem Projekt hinzufügen und meine POM -Datei direkt veröffentlichen müssen:
<? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.shuqing28</groupId> <artifactId>upload</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>upload</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- Lookup übergeordnet von Repository-> </übergeordnet> <Properties> <projekts.build.SourceCoding> UTF-8 </project.build.SourceCoding> <project.Reporting.outputCoding> UTF-8 </project.Reporting.outputCoding> <javoding> 1.8 </projava.version> <Java.version> 1.8 </projava.version> <Java.version> 1.8 </projava.version> <Java.version> 1.8 </projava.version> <Java. <Depopenty> <gruppe> org.springFramework.boot </GroupId> <artifactId> Spring-Boot-Starter </artifactId> </abhängig> <abhängigkeit> <gruppe> org.springFramework <SupructId> org.springFramework.boot </Groupid> <artifactID> Spring-Boot-Konfigurationsprozessor </artifactId> <option> true </optional> </abhängig> <Depopentcy> <gruppeId> org.springFramework <Scope> test </scope> </abhängig> <!-https://mvnrepository.com/artifact/org.webjars/bootstrap-> <deponcy> <GroupId> org.webjars </gruupid> <artifactid> bootstrap </artifactid> </fusion> </fusion> </fusion> </fusion> </fusion> </artifactid> </fusion> </fusion> </fusion> </artifactid> </fusion> </fusion> </fusion> </artifactid> </fusion> </fusion> </fusion> </artifactid> </fusion> </fusion> </fusion> </artifactid> </fusion> </fusion> </fusione https://mvnrepository.com/artifact/org.webjars.bower/jquery --> <dependency> <groupId>org.webjars.bower</groupId> <artifactId>jquery</artifactId> <version>2.2.4</version> </dependency> </dependencies> <build> <plugins> <gruppe> org.springframework.boot </Groupid> <artifactId> Spring-Boot-Maven-Plugin </artifactid> </plugin> </plugins> </build> </project>
Sie können sehen, dass Spring-Boot-Starter-Thymeleaf WebApp enthält und die letzten beiden Webjars Bootstrap und JQuery integrieren, und andere Codes werden verwendet.
Das letzte Feder -Start -Maven -Plugin wird hinzugefügt, wenn das System erstellt wird, und hat die folgenden Vorteile:
1. Es kann alle Gläser unter Klassenpfad verpacken und eine ausführbare Datei "über-jar" erstellen, um den Benutzern die Übertragung von Diensten zu erleichtern.
2. suchen
3. Nach der Spring-Boot-Version wird eine integrierte Abhängigkeitserklärung vorgelegt.
3.. Dateicontroller hochladen
Wenn Sie nur SpringMVC zum Hochladen von Dateien verwenden, müssen Sie eine Multipartresolver-Bean konfigurieren oder eine <multipart-config> in web.xml konfigurieren. Mit Hilfe der automatischen Konfiguration von Spring-Boot müssen Sie jedoch nichts tun. Um die Controller -Klasse direkt zu schreiben, erstellen wir ein neues Controller -Paket unter SRC/Main/Java und erstellen einen neuen FileUploadController:
Paket com.shuqing28.Upload.controller; import com.shuqing28.uploadfiles.pojo.linker; import com.shuqing28.uploadFiles.Exceptions org.springframework.beans.factory.annotation.autowired; import org.springframework.core.io.resource; org.springframework.ui.model; import org.springframework.web.bind.annotation. org.springFramework.web.servlet.mvc.support.redirectattributes; Import Java.io.ioxception; import Java.util.list; Import Java.util.stream.Collectors; @ControllerPublic -Klassen -DateiEUpoadController {private Final -Storage -Storage -Storage -Storage -Storage -Storage -StorageService; @Autowired public FileUploadController (StorageService storageService) {this.storageService = storageService; } @GetMapping("/") public String listUploadedFiles(Model model)throws IOException { List<Linker> linkers = storageService.loadAll().map( path -> new Linker(MvcUriComponentsBuilder.fromMethodName(FileUploadController.class, "serveFile", path.getFileName (). toString ()). build (). tostring (), path.getFileName (). toString ()) .Collect (sammel.tolist ()); model.addattribute ("Linker", Linker); zurück "uploadform" zurückgeben; } @GetMapping ("/file/{Dateiname:.+}") @ResponseBody public responseTity <ressource> serveFile (@PathVariable String Dateiname) {Resource -Datei = StorageService.loadasResource (Dateiname); return responseEnentity.ok (). Header (httpheaders.content_disposition, "Attemment; Dateiname =/" " + file.getFileName () +" /").body(file); } @Postmapping ("/") public String handleFileUpload (@RequestParam ("Datei") MultiPartFile -Datei, recirectAttributes recirectTributes) {storageService.store (Datei); redirectAttributes.addflashAttribute ("message", "Sie erfolgreich hochgeladen" + file.getOriginalFileName () + "!"); return "recirect:/"; } @ExceptionHandler (StorageFilenotFoundException.class) public responseentity <?> HandlestorageFilenotfound (StorageFilenotFoundException exc) {return responseentity.notfound (). Build (); }}Die @Controller -Annotation wird in der Klassendefinition hinzugefügt, um zu beweisen, dass dies ein Controller ist. Jede Methode wird mit @getMapping und @Postmapping hinzugefügt, die entsprechend den Anfragen erhalten und posten.
Zunächst wird @getMapping ("/"), Method ListUploadedFiles, wie der Name schon sagt, die Dateiliste angezeigt. Hier verwenden wir StorageService, um alle Dateien im Ordner zu durchqueren und die MAP -Methode, um die Liste der Link- und Dateinamen zu synthetisieren und ein Array von Linker -Objekten zurückzugeben. Das Linker -Objekt ist ein einfaches Pojo, das nur die folgenden zwei Teile enthält:
private String fileurl; private String -Dateiname;
Diese Methode umfasst die Verwendung von Stream in Java8. Wenn Sie es nicht verstehen, können Sie diesen Artikel über Java8 -Funktionen im Detail (ii) Stream -API lesen.
Als nächstes kommt @GetMapping("/files/{filename:.+}") , Das serve file ist, das Datei -Download -Funktion liefert oder StorageService verwendet, und der StorageService -Code wird später veröffentlicht. Verwenden Sie schließlich Responseentity, um die Datei als Körper an die anforderende Partei zurückzugeben.
Mit dem HandleEeupload von @PostMapping("/") wird die Postanforderung zum Hochladen von Dateien verwendet. Der Parameter @RequestParam ("Datei") extrahiert das Dateiobjekt in der Webseitenanforderung oder verwendet StorageService, um das Objekt zu speichern, und verwendet schließlich eine Weiterleitung, um die Webseite zu aktualisieren, und gibt die erfolgreich hochgeladene Nachricht an.
4. Dateiverarbeitung
Viele vom Controller oben genannte Methoden werden von StorageService bereitgestellt. Wir definieren eine Schnittstelle, die die folgenden Methoden enthält:
Paket com.shuqing28.UploadFiles.service; import org.springframework.core.io.resource; void Store (MultipartFile -Datei); Stream <Path> loadAll (); Pfadlast (String -Dateiname); RessourcenlasteResource (String -Dateiname); void DeleteAll ();}
Da ich nur das lokale Dateisystem verwende, um langfristige Downloads von Dateien zu verarbeiten, habe ich die folgende Implementierungsklasse:
Paket com.shuqing28.UploadFiles.service; import com.shuqing28.UploadFiles.Exceptions.StorageException; import com.shuqing28.Uploadfiles.Exceptions org.springframework.beans.factory.annotation.autowired; import org.springframework.core.io.resource; import org.springframework.core.io.urlrresource; import org.springframework org.springframework java.nio.file.paths; import Java.nio.File.StandardCopyOption; Import Java.util.stream.stream; @ServicePublic Class FilesystemStorageService Implements StorageService {private endgültige Pfad RootLocation; @Autowired public FilesystemStorageService (StorageProperties Properties) {this.rootLocation = paths.get (Properties.getLocation ()); } @Override public void init () {try {files.CreateRectories (rootLocation); } catch (ioException e) {neue StorateException werfen ("konnte Speicher nicht initialisieren", e); }} @Override public void Store (MultiPartFile -Datei) {String FileName = Stringutils.cleanPath (Datei.GetOriginalFileName ()); try {if (Datei.isempty ()) {neue StorateException werfen ("Die leere Datei nicht speichern" + Dateiname); } if (Dateiname.contains ("..")) {// Dies ist eine Sicherheitsprüfung. } Files.copy (file.getInputStream (), this.rootLocation.resolve (Dateiname), StandardCopyOption.Replace_EXISTING); } catch (ioException e) {neue StorateException werfen ("fehlgeschlagene Datei" + Dateiname, e); }} @Override public stream <path> loadAll () {try {return Files.walk (this.rootLocation, 1) .Filter (Path ->! Path.equals (this.rootLocation)) .map (path-> this.rootLocation.relativize (path)); } catch (ioException e) {neue StorateException werfen ("" gespeicherte Dateien nicht gelesen ", e); }} @Override public path load (String -Dateiname) {return rootLocation.resolve (Dateiname); } @Override public Resource loadasResource (String -Dateiname) {try {Path -Datei = load (Dateiname); Ressourcenressource = new urlresource (file.touri ()); if (ressource.exists () || ressource.isreadable ()) {return ressource; } else {thrower New StorageFilenotFoundException ("konnte keine Datei lesen:" + Dateiname); }} catch (fehl Formaledurlexception E) {neue SpeicherfilenotfoundException ("konnte keine Datei lesen:" + Dateiname, e); }} @Override public void deleteAll () {fileSystemutils.deleterecursiv (rootLocation.tofile ()); }}Diese Klasse verwendet im Grunde genommen auch die NIO von Java und definiert das Pfadobjekt, um den Standardspeicherpfad für den Speicherort für die Datei zu definieren.
Schauen wir uns zuerst die Store -Methode an. Der Store akzeptiert ein Mehrpartei -Objekt als Parameter. Im Vergleich zu traditionellen JSP ist es nur Binär -Byte -Arrays vorbei. MultipartFile bietet viele bequeme Methoden, damit wir verschiedene Informationen über die hochgeladene Datei erhalten können:
öffentliche Schnittstelle MultipartFile erweitert InputStreamSource {String getName (); String getoriginalFileName (); String getContentType (); boolean isempty (); long getSize (); byte [] getBytes () löst ioException aus; InputStream getInputStream () löst IOException aus; void Transferto (Datei destia) löst IOException, IllegalStateException aus;} Der Code verwendet die Dateienkopiermethode, um den Dateistrom in den Pfad zu kopieren, der dem Speicherort entspricht. Natürlich können wir auch die TransferTo -Methode verwenden, um die Datei file.transferTo(this.rootLocation.resolve(filename).toFile());
Die LoadAll -Methode lädt alle Dateipfadinformationen in diesem Pfad, lädt die Datei als Ressourcenobjekt und schaut sich den Controller -Code an und akzeptiert schließlich ein Ressourcenobjekt als Körper, um zum Antragsteller zurückzukehren.
5. Front-End-Vorlage
Schließlich ist die Front-End-Vorlage definiert, und hier werden wir uns immer noch den Code ansehen:
<html xmlns: th = "http://www.thymeleaf.org"> <kopf> <title> Share -Dateien </title> </head> <body> <div th: if = "$ {message}"> <h2 th: text EncTTYPE = "MultiPart/Form-Data"> <!-Komponentenstart-> <Eingabe type = "Datei" name = "Datei" style = "Sichtbarkeit: Hidden; Höhe: 0"/> <div> <div name = "fichier1"> <Eingabe type = "text Ende -> <div> <Button type = "Senden"> Senden </button> <button type = "reset"> Reset </button> </div> </form> </div> <div> <ul> <li th: jeder = "linker: $ {linker}" th: text = "$ {linker.filename}"/> </li> </ul> </div> <script src = "// ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.min.js"></script><Script src = "/webjars/bootstrap/3.3.5/js/bootstrap.min.js"> </script> <script type = "text/javaScript" th: inline = "javaScript"> Funktion bs_input_file () {$ (". Input-file"). Vorher (Funktion () () () () (). {var element = $ (". Input-Ghost"); $ (this) .find ("button.btn-reset"). Click (function () {element.val (null); {$ (this) .Parents ('. Input-Datei'). PREV (). } $ (function () {bs_input_file ();}); </script> <link rel = "stylesheet" href = "/webjars/bootstrap/3.3.5/css/bootstrap.min.css" rel = "externe nofollow"/> </body> </html>Das Wichtigste hier ist der Inhalt im <form> -Tag. <form method = "post" action = "/" engTepe = "multiPart/form-data"> engTepe muss als Multipart/Form-Data geschrieben werden. Verwenden Sie Post, um Dateien hochzuladen. Das ursprüngliche Upload -Steuerelement ist hässlich, daher habe ich einen Text+Eingang erstellt und ihn auf die Oberfläche platziert und unten eine unsichtbare Upload -Dateieingabe platziert. Sie können sich den Code selbst ansehen, damit ich in diesem Artikel nicht darüber sprechen werde.
Hier platzieren wir auch eine Liste, um die Dateiliste anzuzeigen. Hier erhalten wir das vom Server bereitgestellte Linker -Objekt. Durch ständige Foreach können wir die beiden Elemente in Fileurl und Dateiname erhalten.
Hier wurde JQuery durch Microsofts CDN ersetzt, und WebJars kann nicht vorgestellt werden, daher weiß ich nicht warum.
Andere Einstellungen
Setzen Sie die Größengrößenlimit des Upload -Datei in SRC/Main/Ressourcen/Application.Properties ein
spring.http.multipart.max-file-size = 128mbspring.http.multipart.max-Request-Größe = 128MB
Darüber hinaus wird der Standard -Dateisparspfad auch festgelegt:
Paket com.shuqing28.UploadFiles.config; import org.springframework.boot.context.properties.configurationProperties; @ConfigurationProperties ("Storage") öffentliche Klassenspeicherpraperties {private String-Standort = "/home/jenkins/upload-/upload/upload/upload/upload/"; public String getLocation () {Rückgabeort; } public void setLocation (String -Speicherort) {this.location = location; }}Beachten Sie hier, dass Sie es aufgrund der Einstellung der StorageProperties zur Anwendungsklasse hinzufügen müssen.
@EnableConfigurationProperties Annotation@SpringbootApplication@EnableConfigurationProperties (StorageProperties.Class) öffentliche Klasse UploadApplication {public static void main (String [] args) {SpringApplication.run (UploadApplication.class, args, args); }}Zusammenfassen
Das obige ist der Spring Boot + Thymeleaf, den der Editor Ihnen vorgestellt hat, um die Datei -Upload- und Download -Funktion zu realisieren. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!