Недавно мой коллега спросил меня, есть ли у меня электронные книги о технологиях. Я открыл небольшую библиотеку на своем компьютере, но электронное письмо было слишком большим, чтобы отправить его, и компания запретила обмен с папками, поэтому я потратил полдня, написав небольшую программу загрузки файлов и развертывая ее на моем машине Linux.
Предоставьте функции: 1. Загрузка файла 2. Список файлов отображение и загрузка
Оригинальный загруженный кусок уродлив. Я написал немного кода JS, чтобы оптимизировать его. Окончательный интерфейс показан следующим образом:
Сначала дайте результаты, и ниже продемонстрируют, как их реализовать шаг за шагом.
1. Создать новый проект
Первое-создать новый проект Spring-Boot. Вы можете инициализировать проект на веб -сайте или использовать функцию Spring Rentier IDE, и вы можете создать новый проект. Здесь я создаю новый проект от Idea:
Далее, затем введите группу и артефакт и продолжайте нажимать далее:
В настоящее время появляется этот интерфейс выбора модуля. Нажмите на веб -параметр и проверьте Интернет, чтобы доказать, что это веб -приложение. Затем нажмите «Шаблонные двигатели», чтобы выбрать шаблонный двигатель фронтального шаблона. Мы выбираем тимлеф. Чиновник Spring-Boot также рекомендует использовать этот шаблон вместо JSP.
Последний шаг, затем подождите, пока проект будет успешно инициализирован.
2. Настройки POM
Во -первых, проверьте, какие зависимости вам нужно добавить в проект, и напрямую опубликовать мой файл POM:
<? 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-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <doliderversion> 4.0.0 </modelversion> <groupid> com.shuquing28 </Group> </modelversion> <groupid> com.shuq <serse> 0.0.1-snapshot </version> <Cackaging> jar </packaging> <mame> upload </name> <Описание> Демо-проект для Spring Boot </description> <parent> <groupd> org.springframework.boot </groupid> <ratifactid> spring-starter-parent-prant Поиск родителя из репозитория-> </parent> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <project.Report.OutputEncoding> utf-8 </project.Reporting.OutputEncoding> <java.version> 1.8 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId> org.springframework.boot </GroupId> <ArtifactId> pring-boot-configuration-processor </artifactid> <phopital> true </opture> </depertive> <dependency> <groupid> org.springframework.boot </Groupid> <ratifactid> spring-starter-starter-test-test-test </GroupD> <ratifactId> Spring-boot-starter-test-test> </depertive> <!-https://mvnrepository.com/artifact/org.webjars/bootstrap-> <Deposity> <groupId> org.webjars </GroupId> <ratifactid> bootstrap </artifactid> <serse> 3.3.5 </version> </зависимость> <!- https://mvnrepository.com/artifact/org.webjars.bower/jquery -> <depertive> <groupid> org.webjars.bower </groupid> <artifactid> jquery </artifactid> <sersive> 2.2.4 </version> </repertive> </repertive> <buld> <blicins>. <groupId> org.springframework.boot </GroupId> <artifactid> Spring-boot-maven-plugin </artifactid> </plugin> </plugins> </build> </project>
Вы можете видеть, что Spring-Boot-Starter-Thymeleaf содержит WebApp, а последние два веб-джара интегрируют Bootstrap и jQuery, и будут использоваться другие коды.
Последний весенний плагин Maven добавляется при создании системы, и он имеет следующие преимущества:
1. Он может упаковать все банки под ClassPath и создать исполняемый «über-Jar», чтобы облегчить пользователям передачу услуг.
2. Автоматическое поиск метода Public Static Void Main () и отметьте его как исполняемый класс
3. Согласно версии Spring-Boot, предоставляется встроенное объяснение зависимости.
3. Загрузить файловой контроллер
Если вы просто используете SpringMVC для загрузки файлов, вам необходимо настроить многочисленную бобы или настроить <Mutuleart-config> в web.xml, но с помощью автоматической конфигурации Spring-Boot вам не нужно ничего делать. Чтобы напрямую написать класс контроллера, мы создаем новый пакет контроллера в SRC/Main/Java и создаем новый файл.
пакет com.shuqing28.upload.controller; import com.shuqing28.uploadfiles.pojo.linker; import com.shuqing28.uploadfiles.exceptions.storagefilenotfoundexception; импорт com.shuqing28.uploadfiles.service.storageService; org.springframework.beans.factory.annotation.autowired; import org.springframework.core.io.resource; импорт org.springframework.http.httpheaders; импорт org.sprimework.http.Responsety; org.springframework.ui.model; import org.springframework.web.bind.nantation.*; import org.springframework.web.multipart.multipartfile; импорт org.springframework.web.servlet.mvc.method.annotation.mvcurapponponsbulponsbulponsbulponsburment.servlet.mvc.method.annotation.mvcurapponponsbrame. org.springframework.web.servlet.mvc.support.redirectattributes; import java.io.ioexception; import java.util.list; import java.util.stream.collectors; @controllerpublic class fileuploadtroller {private final Storageservice storageservice; @Autowired public fileuploadcontroller (Storageservice Storageservice) {this.storageservice = Storageservice; } @GetMapping ("/") public String listuploadedFiles (модель модели) Throws ioException {list <nowerer> linkers = storageservice.loadall (). Map (path -> новый линкер (mvcuricomomponentsbuilder.fromethodname (fileuploadcontroler.class, servfile ",", path.getFilename (). ToString ()). Build (). ToString (), path.getFilename (). ToString ())) .collect (collectors.tolist ()); model.addattribute ("Линкеры", линкеры); вернуть "uploadform"; } @GetMapping ("/files/{filename:.+}") @Responsebody public responseent <resource> servalfile (@pathvariable строкового файла) {resource file = storageservice.loadasresource (filename); return responseentity.ok (). Header (httphaders.content_disposition, "Attactment; filename =/" " + file.getFilename () +" /"").body(file); } @Postmapping ("/") public String harderupload (@RequestParam ("file") MultiplaWFile File, redirectattributes redirectattributes) {Storageservice.store (file); redirectattributes.addflashattribute («Сообщение», «Вы успешно загружены» + file.getoriginalfilename () + "!"); вернуть "перенаправление:/"; } @ExceptionHandler (StorageFilenOtFoundException.class) Public ReplyEntity <?> HandLestorageFilenOtFound (StoragefilenOtFoundException Exc) {return response.notFound (). Build (); }}Аннотация @Controller добавляется в определении класса, доказывая, что это контроллер. Каждый метод добавляется с помощью @getmapping и @postmapping, соответствующего запросам получить и публиковать соответственно.
Прежде всего, @getmapping ("/"), методы ListuploadedFiles, как следует из имени, отображает список файлов. Здесь мы используем Storageservice для прохождения всех файлов в папке и используем метод карты для синтеза ссылки и списка имен файлов, возвращая массив объектов линкера. Объект линкера - это простой Pojo, который содержит только следующие две части:
Private String fileUrl; Private String FileName;
Этот метод включает в себя использование потока в Java8. Если вы не понимаете, вы можете прочитать эту статью о функциях Java8 в деталях (ii) Stream API.
Далее @GetMapping("/files/{filename:.+}") , который представляет собой ForeFile, который предоставляет функцию загрузки файлов или использует Storageservice, а код Storageservice будет опубликован позже. Наконец, используйте ответ, чтобы вернуть файл в качестве органа в запрашивающую сторону.
HandlefileUpload @PostMapping("/") использует запрос POST для загрузки файлов. Параметр @RequestParam («Файл») извлекает объект файла в запросе веб -страницы или использует Storageservice для сохранения объекта, и, наконец, использует перенаправление для обновления веб -страницы и дает успешно загруженное сообщение.
4. Обработка файлов
Многие методы, вызванные контроллером выше, предоставляются Storageservice. Мы определяем интерфейс, который содержит следующие методы:
пакет com.shuqing28.uploadfiles.service; import org.springframework.core.io.resource; импорт org.springframework.web.multipart.multipartfile; импорт java.nio.file.path; импорт java.util.stream.stream; publicface storages {oidservice {oidsemerv {oidsemerv {oidsemorv {oidsemerv {oidsemerv {oidemerv {import java.util.stream. void hore (multiousfile file); Stream <Thap> LoadAll (); PATH LOAD (String FileName); Ресурс LoadasResource (String FileName); void deleteAll ();}Поскольку я просто использую локальную файловую систему для обработки долгосрочных загрузок файлов, у меня есть следующий класс реализации:
пакет com.shuqing28.uploadfiles.service; import com.shuqing28.uploadfiles.exceptions.storageexception; import com.shuqing28.uploadfiles.exceptions.storagefilenotfoundexception; импорт com.shuqing28.uploadfiles.storageproperties; org.springframework.beans.factory.annotation.autowired; импорт org.springframework.core.io.resource; импорт org.springframework.core.io.urlresource; импорт org.springframework.stepolypice.service; импорт org.springframework. org.springframework.util.stringutils; import org.springframework.web.multipart.multipartfile; импорт java.io.ioexception; импорт java.net.malformedurlexection; импорт java.nio.file.files; импорт java.file.path. java.nio.file.paths; import java.nio.file.standardcopyoption; import java.util.stream.stream; @servicepublic class fileystemstorageservice реализует Storageservice {private final Path Rootlocation; @Autowired public filesystemstorageservice (Horeproperties Properties) {this.Rootlocation = paths.get (properties.getLocation ()); } @Override public void init () {try {files.createdirectories (rootlocation); } catch (ioException e) {бросить новое хранилище ("не может инициализировать хранение", e); }} @Override public void Store (MultipartFile File) {string filename = stringUtils.cleanPath (file.getoriginalfilename ()); try {if (file.isempty ()) {throw new StorageException («Не удалось сохранить пустой файл» + имя файла); } if (fileName.contains ("..")) {// Это проверка безопасности. Новое хранилище ("не может хранить файл с относительным путем за пределами текущего каталога" + filename); } Files.copy (file.getInputStream (), this.rootlocation.resolve (имя файла), standarcopyoption.replace_existing); } catch (ioException e) {бросить новое хранилище ("не удалось сохранить файл" + filename, e); }} @Override public Stream <Thpe> loktall () {try {return files.walk (this.rootlocation, 1) .filter (path ->! Path.equals (this.rootlocation)) .map (path-> this.rootlocation.reelativize (path)); } catch (ioException e) {бросить новое хранилище ("не удалось прочитать хранимые файлы", e); }} @Override public Path Load (String fileName) {return rootlocation.resolve (filename); } @Override public resource loadasresource (string fileename) {try {path file = load (filename); Ресурс ресурс = new urlresource (file.touri ()); if (resource.exists () || resource.isreadable ()) {return resource; } else {бросить новое storagefilenotfoundexception ("Не удалось прочитать файл:" + filename); }} catch (malformedurlexception e) {бросить новое хранилище filenotfoundexception ("Не удалось прочитать файл:" + filename, e); }} @Override public void deleteAll () {fileSystemutils.deletetereCursility (rootlocation.tofile ()); }}Этот класс также в основном использует Java's Nio и использует объект Path для определения пути сохранения по умолчанию для местоположения для файла.
Давайте сначала посмотрим на метод магазина. Магазин принимает Multipartfile объект в качестве параметра. По сравнению с традиционным JSP, это просто прохождение бинарных байтовых массивов. MultipartFile предоставляет много удобных методов для вызова, чтобы мы могли получить различную информацию о загруженном файле:
public interface multipfile Extends inputStreamSource {string getName (); String hetoriginalfilename (); String getContentType (); логический isempty (); long getSize (); byte [] getbytes () бросает ioException; InputStream getInputStream () бросает ioException; void Transferto (file dest) бросает ioException, allodalStateException;} Код использует метод копирования файлов для копирования потока файла в путь, соответствующий местоположению. Конечно, мы также можем использовать метод TransferTO для сохранения файла, file.transferTo(this.rootLocation.resolve(filename).toFile());
Метод Loadall загружает всю информацию о пути файла в этом пути, LoadAsResource загружает файл в качестве объекта ресурса, затем посмотрите на код контроллера и, наконец, принимает объект ресурса в качестве тела, чтобы вернуться к запрашиваемому.
5. Передний шаблон
Наконец, шаблон фронта определяется, и здесь мы все равно будем сначала рассмотреть код:
<html xmlns: th = "http://www.thymeleaf.org"> <Head> <Teal> поделиться файлами </title> </head> <body> <div th: if = "$ {message}"> <h2 th: text = "$ {message}"/> </div> <div> <form method = "post ="/"/"/> </> </div> <div> <form = "post ="/"/" enctype="multipart/form-data"> <!-- COMPONENT START --> <input type="file" name="file" style="visibility:hidden; height:0"/> <div> <div name="Fichier1"> <input type="text" placeholder='Choose a file...'/> <span> <button type="button">Choose</button> </span> </div> </div> <!-- COMPONENT END -> <div> <button type = "propect"> отправить </button> <button Type = "reset"> сбросить </button> </div> </form> </div> <div> <ul> <li th: early = "linker: $ {linkers}"> <a th: href = "$ {linker.fileurl}" rellowles /> </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/bootstrap.min.js "> </spriptrap/3.3.5/js/bootstrap.js.js"> </spectrap/3.3.5/js/bootstrapprppret.js "> Th: inline = "javascript"> function bs_input_file () {$ (". input-file"). перед (function () {if (! $ (this) .prev (). Hasclass ('input-ghost')) {var element = $ (". element.next (element) .find ('input'). Val ((element.val ()). Split ('//'). Pop ()); $ (это) .parents (" element; } $ (function () {bs_input_file ();}); </script> <link rel = "styleSheet" href = "/webjars/bootstrap/3.3.5/css/bootstrap.min.css" rel = "External nofollow"/> </body> </html>Важным здесь является содержание в теге <Form>. <form method = "post" action = "/" ectype = "multipart/form-data"> enctype должен быть записан как Multipart/Form-Data. Используйте сообщение для загрузки файлов. Оригинальный элемент управления загрузкой уродлив, поэтому я сделал текст+вход и положил его на поверхность и поместил невидимый ввод файла загрузки ниже. Вы можете взглянуть на код самостоятельно, поэтому я не буду говорить об этом в этой статье.
Здесь мы также размещаем список для отображения списка файлов. Здесь мы получаем объект линкеров, предоставленный сервером. Постоянно предвещаем, мы можем получить два элемента в FileUrl и FileName.
Здесь JQUERY был заменен на CDN Microsoft, и Webjars нельзя представить, поэтому я не знаю, почему.
Другие настройки
Установите ограничение размера файла загрузки в src/main/resources/application.properties
spring.http.multipart.max-file-size = 128mbspring.http.multipart.max-request-size = 128mb
Кроме того, также установлен путь сохранения файлов по умолчанию:
пакет com.shuqing28.uploadfiles.config; import org.springframework.boot.context.properties.configurationProperties; @ConfigurationProperties («Хранение») открытый класс rateproperties {private String location = "/home/jenkins/upload-files/"; public String getLocation () {return Location; } public void setlocation (строка местоположение) {this.location = location; }}Обратите внимание, что из -за настройки хранилищ, вам необходимо добавить его в класс приложений.
@Enableconfigurationproperties аннотация@SpringBootApplication@enableConfigurationProperties (storageProperties.class) открытый класс uploadApplication {public static void main (string [] args) {SpringApplication.run (uploadApplication.class, args); }}Суммировать
Выше приведено Spring Boot + Thymeleaf, который редактор представил вам, чтобы реализовать функцию загрузки и загрузки файла. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!