Baru-baru ini, kolega saya bertanya kepada saya apakah saya memiliki e-book tentang teknologi. Saya membuka perpustakaan kecil di komputer saya, tetapi email itu terlalu besar untuk mengirimnya, dan perusahaan dilarang berbagi dengan folder, jadi saya menghabiskan setengah hari menulis program unggahan file kecil dan menggunakannya di mesin Linux saya.
Menyediakan Fungsi: 1. File Unggah 2. Daftar Daftar File dan Unduh
Bagian yang diunggah asli jelek. Saya menulis beberapa kode JS untuk mengoptimalkannya. Antarmuka terakhir ditampilkan sebagai berikut:
Pertama berikan hasilnya, dan di bawah ini akan menunjukkan cara mengimplementasikannya langkah demi langkah.
1. Buat proyek baru
Hal pertama adalah membuat proyek boot-boot baru. Anda dapat memilih untuk menginisialisasi proyek di situs web atau menggunakan fungsi inisial pegas dari IDE, dan Anda dapat membuat proyek baru. Di sini saya membuat proyek baru dari IDEA:
Selanjutnya, lalu masukkan grup dan artefak dan terus klik Next:
Pada saat ini, antarmuka pemilihan modul ini muncul. Klik opsi Web dan periksa web untuk membuktikan bahwa ini adalah Webapp. Kemudian klik mesin template untuk memilih mesin template front-end. Kami memilih Thymleaf. Pejabat Spring-Boot juga merekomendasikan menggunakan template ini, bukan JSP.
Langkah terakhir, lalu tunggu proyek berhasil diinisialisasi dengan sukses.
2. Pengaturan POM
Pertama, periksa dependensi mana yang perlu Anda tambahkan ke proyek dan langsung memposting file pom saya:
<? Xml Version = "1.0" encoding = "UTF-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <podelversion> 4.0.0 </ModelVersion> <groupid> Com.shuqing2 <version> 0.0.1-Snapshot </version> <packaging> Jar </packaging> <name> unggah </name> <creckreckripe> Proyek Demo untuk Spring Boot </cripence> <parter> <groupid> org.springframework.boot </groupid> <ArtifacTid> Spring-boot-starter-starter-parent </art/version> <ArtifacTid> <artifactD> Spring-boot-starter-starter-parent </art/version> <artifactid> <artefactD> Spring-boot-starter-starter-parent </art/version> <artifactid> <artifactD> Spring-starter-starter-parent </art/version> <artifactid> <artefact> Pencarian Orangtua dari Repositori-> </parents> <Properties> <Project.build.sourceencoding> UTF-8 </project.build.sourceencoding> <poject.reporting.outputenCoding> </project.reporting.outputencoding> <Java.version> </projeksi <dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter </arttifactid> </gandendency> <sependency> <roupid> org.springframework.boot </groupid> <Artifactid> Spring-boot-starter-thymeleaf </troGactid> <Artifactid> <artifactid> <artifactid> <artifactid> <artifactid> <artifactid> <t Artifactid> <t ArtifactId> <t Artifactid> <t Artifactid> <groupid> org.springframework.boot </proupid> <ArtifactId> Spring-boot-konfigurasi-prosesor </artifactid> <pilihan> true </portsional> </dependency> <Artipid> <sruptid> SPRING. </Dependency> <!-https://mvnrepository.com/artifact/org.webjars/bootstrap-> <dependency> <groupid> org.webjars </groupid> <ArTifactid> Bootstrap </arttifactid> <version> 3.3.5 </Versi> </Dependency> </arttifactid> <version> 3.3.5 </Versi> </Dependency> </artifactid> <version> 3.3.5 </Versi> </Versi> </Version> </Version> </Versi> </Version> <///</Version> </Version> </Version> </Versi> </Version> https://mvnrepository.com/artifact/org.webjars.bower/jQuery -> <dependency> <Groupid> org.webjars.bower </groupid> <ArtifactId> </artifactid> <version> 2.2.4 </version> </dependency> </dependence> <version> <versi> 2.2.4 </versi </Dependency> </Dependencees> <groupId> org.springframework.boot </groupid> <ArTifactId> spring-boot-maven-plugin </artifactid> </lugin> </lugin> </build> </project>
Anda dapat melihat bahwa Spring-Boot-Starter-Thymeleaf berisi WebApp, dan dua webjar terakhir mengintegrasikan bootstrap dan jQuery, dan kode lain akan digunakan.
Plugin Spring Boot Maven terakhir ditambahkan saat sistem dibuat, dan memiliki manfaat berikut:
1. Ini dapat mengemas semua toples di bawah ClassPath dan membangun "über-Jar" yang dapat dieksekusi untuk memfasilitasi pengguna untuk mentransfer layanan.
2. Secara otomatis mencari metode statis statis void () dan menandai sebagai kelas yang dapat dieksekusi
3. Menurut versi boot-spring, penjelasan ketergantungan bawaan disediakan.
3. Unggah pengontrol file
Jika Anda hanya menggunakan SpringMVC untuk mengunggah file, Anda perlu mengkonfigurasi kacang multipartresolver, atau mengkonfigurasi <sultipart-Config> di web.xml, tetapi dengan bantuan konfigurasi otomatis Spring-Boot, Anda tidak perlu melakukan apa pun. Untuk menulis kelas pengontrol secara langsung, kami membuat paket pengontrol baru di bawah SRC/Main/Java dan membuat FileuploadController baru:
Paket com.shuqing28.upload.controller; import com.shuqing28.uploadfiles.pojo.linker; import com.shuqing28.uploadfiles.exceptions.StorageFilenotFoundException; impor com.shuqing28.uploadfiles.servicecervice; org.springframework.beans.factory.annotation.Autowired; impor org.springframework.core.io.resource; org.springframework.http.responstreentsity; Impor org.spramework.htp.responsteentity; org.springframework.htp.Responsteentity; org.springframework.ui.model; impor org.springframework.web.bind.annotation.*; impor org.springframework.web.multipart.multipartfile; import org.springframework.web.servlet.mvc.method.annotation org.springframework.web.servlet.mvc.support.RedirectAttributes;import java.io.IOException;import java.util.List;import java.util.stream.Collectors;@Controllerpublic class FileUploadController { private final StorageService 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 (collectors.tolist ()); model.addattribute ("linker", linker); mengembalikan "UploadForm"; } @GetMapping ("/file/{filename :.+}") @ResponseBody Public Responstity <pource> serveFile (@PathVariable String fileName) {sumber daya = StorageService.LoadAsResource (fileName); return responseEntity.ok (). Header (httpheaders.content_disposition, "lampiran; nama file =/" " + file.getFileName () +" /"").body(file); } @PostMapping ("/") Public String HandleFileUpload (@RequestParam ("File") File MultipartFile, RedirectAttributes RedirectAttributes) {StorageService.store (file); redirectattributes.addflashattribute ("pesan", "Anda berhasil mengunggah" + file.getoriginalFileName () + "!"); mengembalikan "Redirect:/"; } @ExceptionHandler (StorageFileNotFoundException.class) Public Responentity <?> HandLestorageFileNotFound (StorageFileNotFoundException exc) {return responEntity.notfound (). Build (); }}Anotasi @Controller ditambahkan pada definisi kelas, membuktikan bahwa ini adalah pengontrol. Setiap metode ditambahkan dengan @getMapping dan @PostMapping sesuai untuk mendapatkan dan memposting permintaan masing -masing.
Pertama -tama, @getmapping ("/"), metode ListuploadedFiles, sesuai namanya, menampilkan daftar file. Di sini kami menggunakan StorageService untuk melintasi semua file di folder, dan menggunakan metode peta untuk mensintesis daftar tautan dan nama file, mengembalikan array objek Linker. Objek Linker adalah pojo sederhana, yang hanya berisi dua bagian berikut:
Private String FileUrl; Private String FileName;
Metode ini mencakup penggunaan aliran di Java8. Jika Anda tidak mengerti, Anda dapat membaca artikel ini tentang fitur Java8 secara detail (ii) Stream API.
Berikutnya adalah @GetMapping("/files/{filename:.+}") , Yang merupakan serveFile, yang menyediakan fungsi unduhan file, atau menggunakan StorageService, dan kode StorageService akan diposting nanti. Akhirnya, gunakan ResponEntity untuk mengembalikan file sebagai badan ke pihak yang meminta.
HandleFileupload dari @PostMapping("/") menggunakan permintaan pos untuk mengunggah file. Parameter @RequestParam ("File") mengekstrak objek file dalam permintaan halaman web, atau menggunakan StorageService untuk menyimpan objek, dan akhirnya menggunakan pengalihan untuk menyegarkan halaman web, dan memberikan pesan yang berhasil diunggah.
4. Pemrosesan File
Banyak metode yang disebut oleh pengontrol di atas disediakan oleh StorageService. Kami mendefinisikan antarmuka yang berisi metode berikut:
Paket com.shuqing28.uploadfiles.service; impor org.springframework.core.io.resource; impor org.springframework.web.multipart.multipartfile; impor java.nio.file.path; impor java.util.stream. void store (file multipartfile); Stream <path> loadAll (); Load jalur (nama file string); Sumber daya loadAsResource (nama file string); void deleteall ();}
Karena saya hanya menggunakan sistem file lokal untuk memproses unduhan file jangka panjang, saya memiliki kelas implementasi berikut:
Paket com.shuqing28.uploadfiles.service; import com.shuqing28.uploadfiles.exceptions.StorageException; import com.shuqing28.uploadfiles.Exceptions.StorageFilenotfoundException; impor com.shuqing28.uPloadfoundException; com.shuqing28.uPloadfoundsorePoundException; com.shuqing28.uPLoadFoundsor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.core.io.resource; Impor org.springframework.core. org.springframework.util.stringutils; impor org.springframework.web.multipart.multipartfile; impor java.io.ioException; impor java.net.malformedurlexception; impor java.nio.file.file. java.nio.file.paths; import java.nio.file.standardcopyoption; impor java.util.stream.stream; @servicepublic kelas fileSystemStorageService mengimplementasikan StorageService {private final rootlocation; @Autowired public filesystemStorageService (properti StorageProPerties) {this.rootlocation = paths.get (properties.getLocation ()); } @Override public void init () {coba {file.createDirectories (rootlocation); } catch (ioException e) {lempar StorageException baru ("tidak dapat menginisialisasi penyimpanan", e); }} @Override public void store (file multipartFile) {string filename = stringutils.cleanpath (file.getoriginalfileName ()); coba {if (file.isempty ()) {lempar StorageException baru ("Gagal menyimpan file kosong" + fileName); } if (FileName.Contains ("..")) {// Ini adalah pemeriksaan keamanan StorageException baru ("tidak dapat menyimpan file dengan jalur relatif di luar direktori saat ini" + fileName); } File.copy (file.getInputStream (), this.rootlocation.resolve (fileName), StandardCopyOption.Replace_existing); } catch (ioException e) {lempar StorageException baru ("Gagal menyimpan file" + nama file, e); }} @Override Public Stream <Path> loadAll () {coba {return file.walk (this.rootlocation, 1) .filter (path ->! Path.equals (this.rootlocation)) .map (path-> this.rootlocation.relativize (path)); } catch (ioException e) {lempar StorageException baru ("Gagal membaca file yang disimpan", e); }} @Override public path load (string fileName) {return rootlocation.resolve (nama file); } @Override Public Resource LoadAsResource (String FileName) {coba {path file = load (fileName); Sumber daya sumber daya = UrlResource baru (file.touri ()); if (resource.exists () || resource.isreadable ()) {return resource; } else {throw new StorageFileNotFoundException ("Tidak dapat membaca file:" + fileName); }} catch (Malformedurlexception e) {Throw New StorageFileNotFoundException ("Tidak dapat membaca file:" + nama file, e); }} @Override public void deleteAll () {filesystemutils.deleterecurity (rootlocation.tofile ()); }}Kelas ini juga pada dasarnya menggunakan NIO Java, dan menggunakan objek PATH untuk menentukan jalur penghematan default untuk lokasi untuk file tersebut.
Mari kita lihat metode toko terlebih dahulu. Toko menerima objek multipartile sebagai parameter. Dibandingkan dengan JSP tradisional, itu hanya melewati array byte biner. MultipartFile menyediakan banyak metode yang nyaman untuk dihubungi, sehingga kami dapat memperoleh berbagai informasi tentang file yang diunggah:
Antarmuka Publik MultipartFile memperluas inputStreamSource {string getName (); String getoriginalfileName (); String getContentType (); boolean isempty (); Long getSize (); byte [] getBytes () melempar ioException; InputStream getInputStream () melempar ioException; void transfererto (file dest) melempar ioException, ilegalstateException;} Kode menggunakan metode salin file untuk menyalin aliran file ke jalur yang sesuai dengan lokasi. Tentu saja, kami juga dapat menggunakan metode transferto untuk menyimpan file, file.transferTo(this.rootLocation.resolve(filename).toFile());
Metode LoadAll memuat semua informasi jalur file di jalur ini, LoadAsResource memuat file sebagai objek sumber daya, kemudian lihat kode pengontrol, dan akhirnya menerima objek sumber daya sebagai badan untuk kembali ke pemohon.
5. Template front-end
Akhirnya, templat front-end didefinisikan, dan di sini kita akan tetap melihat kode terlebih dahulu:
<html xmlns: th = "http://www.thymeleaf.org"> <head> <title> Bagikan file </iteme> </head> <dig> <v: if = "$ {pesan}"> <H2: Text = "$ {pesan}"/</div> <forms/formulir = "$" $ "$" <!-Component Start-> <input type = "file" name = "file" style = "visibilitas: tersembunyi; tinggi: 0"/> <v> <div name = "fichier1"> <input type = "Text" placeholder = 'Pilih file ...'/> <span> <tombol type = "Tombol"> </Tombol </Button> </span> </Div> <span> <span> <tombol = "tombol"> </Tombol </Tombol </span> </Div> type = "Kirim"> Kirim </attond> <tombol type = "reset"> reset </button> </div> </form> </div> <viv> <ul> <li th: masing -masing = "linker: $ {linker}"> <a th: href = "$ {linker.fileurl}" rel = "" href = "$ {tautan. </li> </ul> </div> <script src = "// ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script> <script src ="/webjars/bootstrap/3.3.5/js/js/bootstrap.min. " th: inline = "javascript"> function bs_input_file () {$ (". input-file"). Sebelum (function () {if (! $ (this) .prev (). hasclass ('input-ghost')) {var element = $ (". input-ghost"); element.change () {var elemen = $ (". element.Next (element) .find ('input'). val ((element.val ()). split ('//'). pop ())); $ (ini) .parents (". }); } $ (function () {bs_input_file ();}); </script> <tautan rel = "stylesheet" href = "/webjars/bootstrap/3.3.5/css/bootstrap.min.css" rel = "nofollow eksternal"/> </body> </html>Yang penting di sini adalah konten dalam tag <sorm>. <Form Method = "POST" ACTION = "/" ENCTYPE = "Multipart/Form-Data"> Enctype harus ditulis sebagai multipart/form-data. Gunakan posting untuk mengunggah file. Kontrol unggahan asli jelek, jadi saya membuat input teks+dan meletakkannya di permukaan, dan menempatkan input file unggahan yang tidak terlihat di bawah ini. Anda dapat melihat kode sendiri, jadi saya tidak akan membicarakannya di artikel ini.
Di sini kami juga menempatkan daftar untuk menampilkan daftar file. Di sini kami mendapatkan objek Linkers yang disediakan oleh server. Dengan terus menerus, kita bisa mendapatkan dua elemen dalam fileurl dan nama file.
Di sini, JQuery telah diganti dengan CDN Microsoft, dan Webjars tidak dapat diperkenalkan, jadi saya tidak tahu mengapa.
Pengaturan lainnya
Atur batas ukuran file unggah di SRC/Main/Resources/Application.Properties
spring.http.multipart.max-file-size = 128mbspring.http.multipart.max-request-size = 128MB
Selain itu, jalur penghematan file default juga disetel:
Paket com.shuqing28.uploadfiles.config; impor org.springframework.boot.context.properties.configurationproperties; @configurationproperties ("penyimpanan") StorageProPerties kelas publik {Private String Location = "/Home/Jenkins/Reload-Foiles/"; Public String getLocation () {location return; } public void setLocation (string location) {this.location = location; }}Perhatikan di sini bahwa karena pengaturan StorageProPerties, Anda perlu menambahkannya ke kelas aplikasi.
@EnableConfigurationProperties anotasi@springbootApplication@enableConfigurationProperties (StorageProPerties.class) Public Class Applikasi {public static void main (string [] args) {springApplication.run (unggah aplikasi.class, args); }}Meringkaskan
Di atas adalah Spring Boot + Thymeleaf yang diperkenalkan editor kepada Anda untuk mewujudkan fungsi unggahan dan unduhan file. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!