Se construirmos um pequeno site e apenas escolhemos pilhas de tecnologia de inicialização de Kotlin e Spring, é essencial fazer upload de arquivos. Obviamente, se você criar um site médio e grande, é recomendável usar o armazenamento em nuvem, o que pode economizar muitos problemas.
Este artigo apresenta como usar Kotlin e Spring Boot para fazer upload de arquivos
Projeto de construção
Se você não está muito familiarizado com o projeto de construção, pode se referir a "meu primeiro aplicativo Kotlin"
FILE COMPLETO Build.gradle
Grupo 'Name.quanke.kotlin'version' 1.0-Snapshot'buildscript {ext.kotlin_version = '1.2.10' Ext.spring_boot_version = '1.5.4.release' REPROSTILIES.KOTLIN {MAVENCENTRAL ()} Dependências {ClassPath "ORG.JetBrains.Kotlin. ClassPath ("Org.springframework.boot: Spring-Boot-Gradle-Plugin: $ spring_boot_version") // Kotlin integra o construtor sem parâmetros sem parâmetros do Springboot e define todas as classes para abrir a classe plugin ClassPath ("org.jetbrains.kotlin: kotlin-nargin: classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version") }}apply plugin: 'kotlin'apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-pluginapply plugin: 'org.springframework.boot'jar {Basename =' Capítulo11-5-6-service 'versão =' 0.1.0 '} repositórios {mavencentral ()} dependências {compilam "org.jetbrains.kotlin: kotlin-stdlib-jre8: $ kotlin_versa" " "Org.SpringFramework.Boot: Spring-Boot-Starter-Web: $ spring_boot_version" compile "org.springframework.boot: spring-boot-starter-tymEleaf: spring_boot_version" testcompile "org.springframework.boot: spring-boot_version" "Org.Jetbrains.Kotlin: Kotlin-test-Junit: $ kotlin_version"} compilekotlin {kotlloftions.jvmtarget = "1.8"} CompileTestkotlin {KotLinOptions.jvmtarget = "1.8"}}Crie controlador de upload de arquivos
Importar name.quanke.kotlin.chaper11_5_6.storage.StorageFilENotFoundExceptionMport name.quanke.kotlin.chaper11_5_6.storage.storageserviceImport org.springframework.beans.actory.annotation.aUTowIdImcerd.sPringfringfring.Bean.Factory.annotation.aUTowIdImcer oug.sPringfringfrortwork.Bean.Factory.Anotation.ATowIdiMcer oug.sPringfringFringFROWOR.BeanS.AnTation.ATowIdiMcerd.sringfringfration.Bean.Factory. org.springframework.http.httpheadersimport org.springframework.http.ResponseEntityImport org.springframework.steretype.controllerimport org.springframework.uind.modeliMport.springframework.webring.uind.modeliMorting.springfringfring.webring.uMind.uMindind.ModelInMortation org.springframework.web.multipart.MultipartFileimport org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilderimport org.springframework.web.servlet.mvc.support.RedirectAttributesimport java.io.IOExceptionimport java.util.stream.collectors/*** controlador de upload de arquivo* criado por http://quanke.name em 2018/1/12. */ @Controlerclass fileUploadController @AUTOWIREDCONSTRUTOR (StoreRages Service privado: StorageService) {@GetMapping ("/") @THOWS (IoException :: class) FUN LISTUPLOADEDFILES (Model: Model): String {Model.Adtribute. MvcuricomponentsBuilder .FROMETHNAME (FILEUPLOADCONTROLLER :: Class.java, "ServicFile", Path.Filename.ToString ()) .build (). @ResponseBody Fun ServFile (@PathVariable FileName: String): ResponseEntity <Source> {Val file = storageService.loadAsResource (nome do arquivo) RETORNOTIDADE .OK () .Header (HttpHeaders.content_dispition, "FILENAME/FILENAME =/" "" + FILE.FILENAM @PostMapping ("/") FUN HODEFILEUPLOAD (@RequestParam ("arquivo"): MultipartFile, Redirectattributes: Redirectattributes): String {storageService.store (file) RedirectatRributes.addflashAttribute ("mensagem" "," UpsfullyEd) "Redirect:/"} @ExceptionHandler (StorageFileNotFoundException :: Class) Fun HandleStorageFilENotFound (EXC: StorageFilENotFoundException): ResponseEntity <*> {Return ResponseIntity.NotFound (). Build <Ver> ()}}}}}A interface para fazer upload de serviço de arquivo
import org.springframework.core.io.Resourceimport org.springframework.web.multipart.MultipartFileimport java.nio.file.Pathimport java.util.stream.Streaminterface StorageService { fun init() fun store(file: MultipartFile) fun loadAll(): Stream<Path> fun load(filename: String): Path Fun loadAsResource (nome do arquivo: string): Recurso Fun DeLeTeall ()}Carregue o serviço de arquivo
importar org.springframework.beans.factory.annotation.autowiredImport org.springframework.core.io.resourceimport org.springframework.core.iServiceImport orgEmport.sPringFrameWorkworks.teroTypey org.springframework.util.StringUtilsimport org.springframework.web.multipart.MultipartFileimport java.io.IOExceptionimport java.net.MalformedURLExceptionimport java.nio.file.Filesimport java.nio.file.Pathimport java.nio.file.Pathsimport java.nio.file.standardcopyOptionImport java.util.stream.stream@serviceclass filesystemstorageService @autowiredConstructor (Propriedades: storageProperties): storageService {private val rootlocation: path init {this.rootLocation = paths.gets.gets.gets: (PROTTURATION.LOTLOCATIONS): Val FILENAME = StringUtils.cleanPath (file.originalFilename) Try {if (file.isEmpty) {Throw StorageException ("Falha ao armazenar o arquivo vazio" + FileName)} se (FILEName.Contans (".." .. ") {// Esta é uma verificação de segurança StorageException (" não pode armazenar o arquivo do caminho externo " this.rootLocation.Resolve (nome do arquivo), StandardCopyOption.replace_existing)} catch (e: ioexception) {tiro storageException ("falha ao armazenar o arquivo" + arquivo, e)}} notloclocation 1): riachol). .Map {Path -> this.rootLocation.Relative (Path)}} Catch (e: ioException) {Throw StorageException ("Falha ao ler arquivos armazenados", e)}} Substituir Fun LOAD (FILENAME: String): Path {Return RootLocation.Resolve (FILENAME)} RESUMIDE FUNS FUNS FUNS carregar (nome do arquivo) val Resource = urlResource (file.touri ()) retornar if (Resource.exists () || Resource.isReadelable) {Resource} else {Throw StorageFilENotFoundException ("não poderia ler o arquivo:" + filename)}} Catch (e: malformException) {storageFerRayForneIl: " + arquivo)}}} Catch (e: MalformException) {StorageFrenageil }} substituir FUN DELETEALL () {filesystemutils.deleterecursive (rootlocation.tofile ())} substituir Fun init () {try {files.createDirectories (rootlocation)} Catch (e: ioexception) {throw storageException ("Não poderia inicializar o armazenamento, e)}}Exceções personalizadas
Aberto da classe StorageException: RunTimeException {construtor (mensagem: string): super (message) construtor (mensagem: string, causa: arremesso): super (mensagem, causa)} classe storageFilENOTFoundException: storageException {construtor (mensagem: string): super (mensagem) (mensagem) (mensagem: string, causa: throwable): (, causar): construtor de mensagens:Diretório de upload de arquivo de configuração
importar org.springframework.boot.context.properties.configurationproperties@configurationproperties ("storage") classe storageproperties { / ** * localização da pasta para arquivos de armazenamento * / var de localização = "upload-Dir"}Inicie a bota da primavera
/*** Criado por http://quanke.name em 2018/1/9. */ @SpringBoOTApplication @EnableConfigurationProperties (StorageProperties :: Class) Classe Application {@Bean Fun Internal Fun Init (StorageService: StorageService) = CommandLineRunner {StorageService.DeleteAll () STORAGESVICE.InIT ()} Companion Object { {Springapplication.run (aplicativo :: class.java, *args)}}}Crie um modelo html simples src/main/rources/modsates/uploadform.html
<html xmlns: th = "http://www.thymeleaf.org"> <body> <div th: if = "$ {message}"> <h2 th: text = "$ {message}"/> </div> <div> <form = "pós" "Enctype =") upload: </td> <td> <input type = "file" name = "file"/> </td> </tr> <tr> <td> </td> <td> <input type = "submit" value = "upload"/> </td> </tr> </table> </forma "</div> th: href = "$ {file}" rel = "Nofollow externo" th: text = "$ {file}"/> </li> </ul> </div> </body> </html>Application Application.yml
Primavera: HTTP: Multipart: Max-File-Size: 128kb Max-request-size: 128kb
Para mais bota de primavera e conteúdo relacionado a Kotlin, siga "Spring Boot e Kotlin Practical Battle"
Código -fonte:
https://github.com/quanke/spring-boot-with-kotlin-in-action/
Consulte:
https://spring.io/guides/gs/uploading-files/
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.