최근에 동료가 기술에 대한 전자 책이 있는지 물었습니다. 내 컴퓨터에 작은 라이브러리를 열었지만 이메일이 너무 커서 폴더와 공유하는 것을 금지했기 때문에 작은 파일 업로드 프로그램을 작성하고 Linux 시스템에 배포하는 데 반나절을 보냈습니다.
기능 제공 : 1. 파일 업로드 2. 파일 목록 표시 및 다운로드
원래 업로드 된 조각은 추악합니다. 나는 그것을 최적화하기 위해 JS 코드를 작성했습니다. 최종 인터페이스는 다음과 같이 표시됩니다.
먼저 결과를 제공하고 아래는 단계별로 구현하는 방법을 보여줍니다.
1. 새 프로젝트를 만듭니다
첫 번째는 새로운 스프링 부츠 프로젝트를 만드는 것입니다. 웹 사이트에서 프로젝트를 초기화하거나 IDE의 Spring 초기 기능을 사용하여 새 프로젝트를 만들 수 있습니다. 여기서 나는 아이디어에서 새로운 프로젝트를 만듭니다.
다음으로 Group 및 Artifact를 입력하고 다음을 클릭하십시오.
현재이 모듈 선택 인터페이스가 나타납니다. 웹 옵션을 클릭하고 웹을 확인하여 웹 앱임을 증명하십시오. 그런 다음 템플릿 엔진을 클릭하여 프론트 엔드 템플릿 엔진을 선택하십시오. 우리는 Thymleaf를 선택합니다. 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"> <modeversion> 4.0.0 </modelversion> <groupid> com.shuqing28 </groupid> </urtifactid> <버전> 0.0.1-snapShot </version> <packaging> jar </packaging> <name> 업로드 </name> <description> 스프링 부츠를위한 데모 프로젝트 </descrip> <perg.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <version> 1.9. 저장소의 부모-> </parent> <properties> <proffect.build.build.sourceencoding> utf-8 </project.build.sourceencoding> <proffess.reporting.outputencoding> utf-8 </project.reporting.outputencoding> <java.version> 1.8 </java.version> version> </justies> </java. <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter </artifactid> </fectionement> <pectionency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-themeleaf </arevicactid> </felevency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-configuration-processor </artifactid> <pectional> true </옵션> </expendency> <groupId> org.springframework.boot <artifactid> spring-bboot-test </artifactid> <Scope> 테스트 </scope> </fectionency> <!-https://mvnrepository.com/artifact/org.webjars/bootstrap-> <pectionency> <groupid> org.webjars </groupid> <artifactid> bootstrap </artifactid> version> 3.3.5 </version> <! <! https://mvnrepository.com/artifact/org.webjars.bower/jquery-> <pectionency> <groupid> org.webjars.bower </groupid> <artifactid> jquery </artifactid> </artifactid> </version> </fectionemies> <plugins> <groupid> org.springframework.boot </groupid> <artifactid> Spring-boot-maven-plugin </artifactid> </plugin> </plugins> </build> </project>
Spring-Boot-Starter-Thymeleaf에는 WebApp이 포함되어 있으며 마지막 두 Webjars는 부트 스트랩 및 jQuery를 통합하며 다른 코드가 사용됩니다.
지난 Spring Boot Maven 플러그인은 시스템이 생성 될 때 추가되며 다음과 같은 이점이 있습니다.
1. 클래스 경로 아래의 모든 항아리를 포장하고 사용자가 서비스를 전송하도록 촉진하기 위해 실행 파일 "über-jar"를 구축 할 수 있습니다.
2. 공개 정적 무효 메소드 () 메소드를 자동으로 검색하고 실행 가능한 클래스로 표시합니다.
3. 스프링 부팅 버전에 따르면 내장 의존성 설명이 제공됩니다.
3. 파일 컨트롤러를 업로드하십시오
SpringMVC를 사용하여 파일을 업로드하는 경우 Multipartresolver Bean을 구성하거나 web.xml에서 <tultipart-config>를 구성해야하지만 Spring-Boot의 자동 구성에 도움이되면 아무것도 할 필요가 없습니다. 컨트롤러 클래스를 직접 작성하려면 SRC/Main/Java 아래에 새 컨트롤러 패키지를 작성하고 새 FileUploadController를 만듭니다.
패키지 com.shuqing28.upload.controller; import com.shuqing28.uploadfiles.pojo.linker; import com.shuqing28.uploadfiles.exceptions.storagefilenotfoundException; import com.shuqing28.uploadfiles.service.storagesvice; import org.springframework.bean.bean.bean.annotation.autowired; import org.springframework.core.io.resource; import org.springframework.http.httppheaders; import org.springframework.rspramework.springframwork.stereteTeTeTETETETETETETETETETETERTERTERTERTETETETETETETERTETETETETETETETETETETETETETETETETETETETETERG org.springframework.ui.model; import org.springframework.web.bind.annotation*; import org.sprameframework.web.multipart.multipartfile; import org.springframework.web.servlet.mvc.method.annotation.mvcuricicocomponentsbuilderbuilder; org.springframework.web.servlet.mvc.support.redirectattributes; import java.io.ioexception; import java.util.list; import java.util.stream.collectors; @controllerpublic classe fileUploadcontroller {private worlyageservice storagesvicevice; @autowired public fileUploadController (StoragesErgice StoragesErgice) {this.StoragesErvice = StoragesErvice; } @GetMapping ( "/") public String listuploadedFiles (모델 모델)는 ioException {list <linker> linkers = storageservice.loadall (). map (path-> new Linker (mvcuricomponentsBuilder.fripmethodName (fileUploadController.class, servile) ", path.getFilename (). toString ()). build (). toString (), path.getFilename (). toString ())) .collect (collectors.tolist ()); model.adtattribute ( "링커", 링커); "uploadform"을 반환합니다. } @getMapping ( "/files/{filename :.+}") @ResponseBody public responseentity <Reporce> servfile (@PathVariable String filename) {resource file = storageService.loadAsource (filename); return responseNity.ok (). 헤더 (httpheaders.content_disposition, "첨부 파일; filename =/" " + file.getfilename () +"/"".body(file); } @postmapping ( "/") public String handleFileUpload (@requestparam ( "file") multipartfile 파일, RedirectAttributes redirectattributes) {storageservice.store (파일); REDIRECTATTRIBUTES.ADDFLASHATTRIBUTE ( "Message", "귀하는 성공적으로" + file.getoriginalFilename () + "!"); "리디렉션 :/"를 반환합니다. } @ExceptionHandler (StorageFilenotFoundException.class) public response entity <?> handlestorageFilenotFound (StorageFilenotFoundException exc) {return responsenity.notfound (). build (); }}@Controller 주석은 클래스 정의에 추가되어 이것이 컨트롤러임을 증명합니다. 각 메소드는 각각 get and post 요청에 해당하는 @getmapping 및 @postmapping과 함께 추가됩니다.
우선, 이름에서 알 수 있듯이 메소드 ListUploadedFiles, 메소드 ListUploadedFiles는 파일 목록을 표시합니다. 여기서는 StoragesErvice를 사용하여 폴더의 모든 파일을 통과하고 맵 메소드를 사용하여 링크 및 파일 이름 목록을 합성하여 링커 개체의 배열을 반환합니다. 링커 객체는 간단한 pojo로 다음 두 부분 만 포함합니다.
개인 문자열 파일; 개인 문자열 파일 이름;
이 방법에는 Java8에서의 스트림 사용이 포함됩니다. 이해하지 못하면 Java8 기능에 대한이 기사를 자세히 읽을 수 있습니다 (ii) 스트림 API.
다음은 @GetMapping("/files/{filename:.+}") 이며, 파일 다운로드 함수를 제공하거나 StoragesErvice를 사용하는 ServFile이며 StoragesErgice Code는 나중에 게시됩니다. 마지막으로 응답을 사용하여 파일을 요청 당사자에게 신체로 반환하십시오.
@PostMapping("/") 의 handleFileUpload ( "/")는 포스트 요청을 사용하여 파일을 업로드합니다. 매개 변수 @requestparam ( "file")은 웹 페이지 요청에서 파일 객체를 추출하거나 StoragesErvice를 사용하여 개체를 저장하고 리디렉션을 사용하여 웹 페이지를 새로 고침하고 성공적으로 업로드 된 메시지를 제공합니다.
4. 파일 처리
위의 컨트롤러에서 불리는 많은 방법은 StoragesService에서 제공합니다. 다음 방법이 포함 된 인터페이스를 정의합니다.
패키지 com.shuqing28.uploadfiles.service; import org.springframework.core.io.resource; import org.springframework.web.multipart.multipartfile; import java.nio.file.pile; import java.util.stream.stream; public interface vervice {void init (); void store (multipartfile 파일); stream <aTH> loadAll (); 경로로드 (String filename); Resource LoadAsResource (String filename); void deleteall ();}로컬 파일 시스템을 사용하여 장기 파일 다운로드를 처리하기 때문에 다음과 같은 구현 클래스가 있습니다.
패키지 com.shuqing28.uploadfiles.service; import com.shuqing28.uploadfiles.exceptions.storageException; import com.shuqing28.uploadfiles.exceptions.storagefilenotfoundException; import com.shuqing28.uploadfiles.config.storageproperties; org.springframework.bean.beans.annotation.autowired; import org.springframework.core.io.resource; import org.springframework.core.io.urlresource; import org.spramepramework.sertype.service; import org.springframework.filesystemutss; org.springframework.util.stringutils; import org.springframework.web.multipart.multipartfile; import java.io.ioexception; import java.net.malformedurlexception; import java.nio.file.files; import java.nio.file.path; java.nio.nio.file java.nio.file.paths; import java.nio.file.standardCopyOption; import java.util.stream.stream; @ServicePublic 클래스 FileSystemStoragesErgice emplesments StoragesErvice {private final Path Rootlocation; @autowired public filesystemstorageservice (stac } @override public void init () {try {files.createdirectories (rootlocation); } catch (ioException e) {새 StorageException 던지기 ( "스토리지 초기화 할 수 없음", e); }} @override public void store (multipartFile 파일) {String filename = stringUtils.cleanPath (file.getoriginalFilename ()); try {if (file.isempty ()) {Throw New StorageException ( "빈 파일을 저장 실패" + filename); } if (filename.contains ( "..")) {// 보안 검사 새 스토리지 exception ( "현재 디렉토리 외부에 상대 경로가있는 파일을 저장할 수 없습니다" + filename); } files.copy (file.getInputStream (), this.RootLocation.Resolve (filename), StandardCopyOption.Replace_Existing); } catch (ioException e) {새 StorageException 던지기 ( "파일 저장 실패" + filename, e); }} @override public stream <ath> loadall () {try {return files.walk (this.rootlocation, 1) .filter (path->! path.equals (this.rootlocation)) .map (path-> this.rootlocation.rootlocation.rootivize (path)); } catch (ioexception e) {새 스토리지 exception ( "저장된 파일을 읽지 못했다", e); }} @override public path load (String filename) {return rootlocation.resolve (filename); } @override public resource loadAsResource (String filename) {try {path file = load (filename); Resource Resource = New UrlResource (file.touri ()); if (resource.exists () || resource.isreadable ()) {return resource; } else {새 StorageFilenotFoundException ( "파일을 읽을 수 없음 :" + filename); }} catch (marformedurlexception e) {새 StorageFilenotFoundException ( "파일을 읽을 수 없습니다 :" + filename, e); }} @override public void deleteall () {filesystemutils.deletereCursivel (rootlocation.tofile ()); }}이 클래스는 기본적으로 Java의 NIO를 사용하고 경로 개체를 사용하여 파일 위치의 기본 저장 경로를 정의합니다.
먼저 상점 방법을 살펴 보겠습니다. 스토어는 MultipartFile 객체를 매개 변수로 받아들입니다. 기존 JSP와 비교하여 바이너리 바이트 어레이를 통과하고 있습니다. MultipartFile은 호출 할 수있는 많은 편리한 방법을 제공하여 업로드 된 파일에 대한 다양한 정보를 얻을 수 있도록합니다.
public interface multipartfile 확장 inputStreamSource {string getName (); 문자열 getoriginalfilename (); 문자열 getContentType (); 부울 isempty (); long getsize (); 바이트 [] getBytes ()는 ioexception을 던졌습니다. inputStream getInputStream ()은 ioException을 던졌습니다. void transferto (File Dest)는 ioException, 불법 스테이트 exception;} 던지기 코드는 파일 복사 메소드를 사용하여 파일 스트림을 위치에 해당하는 경로로 복사합니다. 물론 TransferTo 메소드를 사용하여 파일, file.transferTo(this.rootLocation.resolve(filename).toFile());
LoadAll 메소드는이 경로에 모든 파일 경로 정보를로드하고로드 스러스는 파일을 리소스 객체로로드 한 다음 컨트롤러 코드를보고 마지막으로 리소스 객체를 신청자로 수락 할 수 있습니다.
5. 프론트 엔드 템플릿
마지막으로 프론트 엔드 템플릿이 정의되어 있으며 여기서는 코드를 먼저 살펴 보겠습니다.
<html xmlns : th = "http://www.thymeleaf.org"> <head> <title> 공유 파일 </title> </head> <body> <div th : if = "$ {message}"> <h2 th : text = "$ {message}"/> </div> <폼 메소드 = "action"/"act"/"act" "act" "act" "act"/"act" <!-구성 요소 시작-> <input type = "file"name = "file"style "style"style = "가시성 : hidden; height : 0"/> <div> <div name = "fichier1"> <input type = "text"placeHolder = '파일 선택 ...'/> <span> <button type </button> </div> </div> </div> type = "제출"> 제출 </button> <button type = "Reset"> 재설정 </button> </div> </div> <div> <ul> <li th : eary = "inlinker : $ {linkers}"> <a th : href = "$ {linker.fileurl}"rel = "intertal nofollow"tept = "$ {filename}" ". </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 "> th : inline = "javaScript"> 함수 bs_input_file () {$ ( ". 입력 파일"). 전 (function () {if (! $ (this) .prev (). hasclass ( 'input-ghost'))) {var element = $ ( ". input-ghost"); element.change () { 요소 (요소). $ (this). }); } $ (function () {bs_input_file ();}); </script> <link rel = "스타일 시트"href = "/webjars/bootstrap/3.3.5/css/bootstrap.min.css"rel = "외부 nofollow"/</body> </html>여기서 중요한 것은 <form> 태그의 내용입니다. <form method = "post"action = "/"encType = "multipart/form-data"> EncType는 멀티 파트/양식 데이터로 작성해야합니다. 게시물을 사용하여 파일을 업로드하십시오. 원래 업로드 컨트롤은 추악하므로 텍스트+입력을 만들어 표면에 배치하고 아래에 보이지 않는 업로드 파일 입력을 배치했습니다. 코드를 직접 볼 수 있으므로이 기사에서는 이에 대해 이야기하지 않습니다.
여기에 파일 목록을 표시 할 목록도 배치됩니다. 여기서 우리는 서버에서 제공하는 링커 객체를 얻습니다. 끊임없이 Foreach를 통해 FileUrl과 Filename에서 두 요소를 얻을 수 있습니다.
여기서는 JQuery가 Microsoft의 CDN으로 대체되었으며 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 ( "Storage") 공개 클래스 StorageProperties {private String location = "/home/jenkins/upload-files/"; 공개 문자열 getLocation () {반환 위치; } public void setLocation (문자열 위치) {this.location = location; }}여기서 StorageProperties 설정으로 인해 응용 프로그램 클래스에 추가해야합니다.
@EnableConfigurationProperties annotation@springbootApplication@enableConfigurationProperties (StorageProperties.class) public class uploadApplication {public static void main (string [] args) {springApplication.run (uploadApplication.class, args); }}요약
위의 것은 편집기가 파일 업로드 및 다운로드 함수를 실현하기 위해 소개 한 Spring Boot + Thymeleaf입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!