


Comment SpringBoot implémente les fonctions de téléchargement et de téléchargement de fichiers
Téléchargement et téléchargement de fichiers Spring Boot
Dans le développement réel d'applications Web, afin de télécharger avec succès des fichiers, la méthode du formulaire doit être définie sur post et l'enctype doit être défini sur multipart/form-data. Ce n'est qu'avec ce paramètre que le navigateur peut envoyer les données binaires du fichier sélectionné au serveur.
À partir de Servlet 3.0, des méthodes de gestion des téléchargements de fichiers ont été fournies, mais ce téléchargement de fichiers doit être effectué dans Java Servlet, et Spring MVC fournit une encapsulation plus simple. Spring MVC implémente une classe d'implémentation MultipartResolver CommonsMultipartResolver via la technologie Apache Commons FileUpload pour terminer le téléchargement de fichiers. Par conséquent, le téléchargement de fichiers de Spring MVC doit s'appuyer sur le composant Apache Commons FileUpload.
Spring MVC lie automatiquement le fichier téléchargé à l'objet MultipartFile. MultipartFile fournit des méthodes pour obtenir le contenu du fichier téléchargé, le nom du fichier, etc., et télécharge le fichier sur le disque du serveur via la méthode transferTo. Les méthodes courantes de MultipartFile sont les suivantes. suit :
-
byte[] getBytes() : récupère les données du fichier.
String getContentType() : récupère le type MIME du fichier, tel que image/jpeg, etc.
InputStream getInputStream() : récupère le flux de fichiers.
String getName() : récupère le nom du composant fichier dans le formulaire.
String getOriginalFilename() : Obtenez le nom d'origine du fichier téléchargé.
long getSize() : Obtenez la taille en octets du fichier, en octets.
boolean isEmpty() : s'il existe (choix) de télécharger un fichier.
void transferTo(File dest) : enregistrez le fichier téléchargé dans un fichier de destination.
Spring-boot-starter-web de Spring Boot a intégré Spring MVC, il est donc plus pratique d'utiliser Spring Boot pour télécharger des fichiers. Il vous suffit d'introduire la dépendance du composant Apache Commons FileUpload.
Exemple
Ce qui suit explique le processus de mise en œuvre du téléchargement et du téléchargement de fichiers Spring Boot à travers un exemple.
【Exemple 7】Téléchargement et téléchargement de fichiers Spring Boot.
Les étapes spécifiques de mise en œuvre sont les suivantes.
1. Introduisez la dépendance du composant Apache Commons FileUpload
Dans le fichier pom.xml de l'application Web ch7_2, ajoutez la dépendance du composant Apache Commons FileUpload Le code spécifique est le suivant :
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <!-- 由于commons-fileupload组件不属于Spring Boot,所以需要加上版本 --> <version>1.4</version> </dependency>
2. limit
Dans l'application web ch7_2 Dans le fichier de configuration application.properties, ajoutez la configuration suivante pour limiter la taille des fichiers téléchargés.
#上传文件时,默认单个上传文件大小是1MB,max-file-size设置单个上传文件大小 spring.servlet.multipart.max-file-size=50MB #默认总文件大小是10MB,max-request-size设置总上传文件大小 spring.servlet.multipart.max-request-size=500MB
3. Créez la page d'affichage de sélection de fichiers
Dans le répertoire src/main/resources/templates de l'application ch7_2, créez la page d'affichage de sélection de fichiers uploadFile.html. Il existe un formulaire avec la valeur d'attribut enctype multipart/form-data sur cette page. Le code spécifique est le suivant :
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Insert title here</title> <link rel="stylesheet" th:href="@{css/bootstrap.min.css}" /> <!-- 默认访问 src/main/resources/static下的css文件夹--> <link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" /> </head> <body> <div class="panel panel-primary"> <div class="panel-heading"> <h4 class="panel-title">文件上传示例</h4> </div> </div> <div class="container"> <div class="row"> <div class="col-md-6 col-sm-6"> <form class="form-horizontal" action="upload" method="post" enctype="multipart/form-data"> <div class="form-group"> <div class="input-group col-md-6"> <span class="input-group-addon"> <i class="glyphicon glyphicon-pencil"></i> </span> <input class="form-control" type="text" name="description" th:placeholder="文件描述"/> </div> </div> <div class="form-group"> <div class="input-group col-md-6"> <span class="input-group-addon"> <i class="glyphicon glyphicon-search"></i> </span> <input class="form-control" type="file" name="myfile" th:placeholder="请选择文件"/> </div> </div> <div class="form-group"> <div class="col-md-6"> <div class="btn-group btn-group-justified"> <div class="btn-group"> <button type="submit" class="btn btn-success"> <span class="glyphicon glyphicon-share"></span> 上传文件 </button> </div> </div> </div> </div> </form> </div> </div> </div> </body> </html>
4 Créez un contrôleur
Dans le package com.ch.ch7_2.controller de l'application ch7_2. , créez une classe de contrôleur TestFileUpload. Il existe 4 méthodes de traitement dans cette classe, l'une est la méthode de navigation d'interface uploadFile, l'autre est la méthode de téléchargement qui implémente le téléchargement de fichiers, l'une est la méthode showDownLoad qui affiche le fichier à télécharger et l'autre est la méthode de téléchargement qui implémente le fonction de téléchargement. Le code principal est le suivant :
@Controller public class TestFileUpload { @RequestMapping("/uploadFile") public String uploadFile() { return "uploadFile"; } /** * 上传文件自动绑定到MultipartFile对象中, * 在这里使用处理方法的形参接收请求参数。 */ @RequestMapping("/upload") public String upload( HttpServletRequest request, @RequestParam("description") String description, @RequestParam("myfile") MultipartFile myfile) throws IllegalStateException, IOException { System.out.println("文件描述:" + description); //如果选择了上传文件,将文件上传到指定的目录uploadFiles if(!myfile.isEmpty()) { //上传文件路径 String path = request.getServletContext().getRealPath("/uploadFiles/"); //获得上传文件原名 String fileName = myfile.getOriginalFilename(); File filePath = new File(path + File.separator + fileName); //如果文件目录不存在,创建目录 if(!filePath.getParentFile().exists()) { filePath.getParentFile().mkdirs(); } //将上传文件保存到一个目标文件中 myfile.transferTo(filePath); } //转发到一个请求处理方法,查询将要下载的文件 return "forward:/showDownLoad"; } /** * 显示要下载的文件 */ @RequestMapping("/showDownLoad") public String showDownLoad(HttpServletRequest request, Model model) { String path = request.getServletContext().getRealPath("/uploadFiles/"); File fileDir = new File(path); //从指定目录获得文件列表 File filesList[] = fileDir.listFiles(); model.addAttribute("filesList", filesList); return "showFile"; } /** * 实现下载功能 */ @RequestMapping("/download") public ResponseEntity<byte[]> download( HttpServletRequest request, @RequestParam("filename") String filename, @RequestHeader("User-Agent") String userAgent) throws IOException { //下载文件路径 String path = request.getServletContext().getRealPath("/uploadFiles/"); //构建将要下载的文件对象 File downFile = new File(path + File.separator + filename); //ok表示HTTP中的状态是200 BodyBuilder builder = ResponseEntity.ok(); //内容长度 builder.contentLength(downFile.length()); //application/octet-stream:二进制流数据(最常见的文件下载) builder.contentType(MediaType.APPLICATION_OCTET_STREAM); //使用URLEncoder.encode对文件名进行编码 filename = URLEncoder.encode(filename,"UTF-8"); /** * 设置实际的响应文件名,告诉浏览器文件要用于“下载”和“保存”。 * 不同的浏览器,处理方式不同,根据浏览器的实际情况区别对待。 */ if(userAgent.indexOf("MSIE") > 0) { //IE浏览器,只需要用UTF-8字符集进行URL编码 builder.header("Content-Disposition", "attachment; filename=" + filename); }else { /**非IE浏览器,如FireFox、Chrome等浏览器,则需要说明编码的字符集 * filename后面有个*号,在UTF-8后面有两个单引号 */ builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename); } return builder.body(FileUtils.readFileToByteArray(downFile)); } }
5. Créez une page d'affichage de téléchargement de fichier
Dans le répertoire src/main/resources/templates de l'application ch7_2, créez une page d'affichage de téléchargement de fichier showFile.html. Le code principal est le suivant :
<body> <div class="panel panel-primary"> <div class="panel-heading"> <h4 class="panel-title">文件下载示例</h4> </div> </div> <div class="container"> <div class="panel panel-primary"> <div class="panel-heading"> <h4 class="panel-title">文件列表</h4> </div> <div class="panel-body"> <div class="table table-responsive"> <table class="table table-bordered table-hover"> <tbody class="text-center"> <tr th:each="file,fileStat:${filesList}"> <td> <span th:text="${fileStat.count}"></span> </td> <td> <!--file.name相当于调用getName()方法获得文件名称 --> <a th:href="@{download(filename=${file.name})}"> <span th:text="${file.name}"></span> </a> </td> </tr> </tbody> </table> </div> </div> </div> </div> </body>
6. Exécutez
Tout d'abord, exécutez la classe principale Ch72Application. Ensuite, visitez http://localhost:8080/ch7_2/uploadFile pour tester le téléchargement et le téléchargement de fichiers.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Introduction à Jasypt Jasypt est une bibliothèque Java qui permet à un développeur d'ajouter des fonctionnalités de chiffrement de base à son projet avec un minimum d'effort et ne nécessite pas une compréhension approfondie du fonctionnement du chiffrement. Haute sécurité pour le chiffrement unidirectionnel et bidirectionnel. technologie de cryptage basée sur des normes. Cryptez les mots de passe, le texte, les chiffres, les binaires... Convient pour l'intégration dans des applications basées sur Spring, API ouverte, pour une utilisation avec n'importe quel fournisseur JCE... Ajoutez la dépendance suivante : com.github.ulisesbocchiojasypt-spring-boot-starter2 1.1. Les avantages de Jasypt protègent la sécurité de notre système. Même en cas de fuite du code, la source de données peut être garantie.

Scénario d'utilisation 1. La commande a été passée avec succès mais le paiement n'a pas été effectué dans les 30 minutes. Le paiement a expiré et la commande a été automatiquement annulée 2. La commande a été signée et aucune évaluation n'a été effectuée pendant 7 jours après la signature. Si la commande expire et n'est pas évaluée, le système donne par défaut une note positive. 3. La commande est passée avec succès. Si le commerçant ne reçoit pas la commande pendant 5 minutes, la commande est annulée. 4. Le délai de livraison expire et. un rappel par SMS est envoyé... Pour les scénarios avec des délais longs et de faibles performances en temps réel, nous pouvons utiliser la planification des tâches pour effectuer un traitement d'interrogation régulier. Par exemple : xxl-job Aujourd'hui, nous allons choisir

1. Redis implémente le principe du verrouillage distribué et pourquoi les verrous distribués sont nécessaires. Avant de parler de verrous distribués, il est nécessaire d'expliquer pourquoi les verrous distribués sont nécessaires. Le contraire des verrous distribués est le verrouillage autonome. Lorsque nous écrivons des programmes multithreads, nous évitons les problèmes de données causés par l'utilisation d'une variable partagée en même temps. Nous utilisons généralement un verrou pour exclure mutuellement les variables partagées afin de garantir l'exactitude de celles-ci. les variables partagées. Son champ d’utilisation est dans le même processus. S’il existe plusieurs processus qui doivent exploiter une ressource partagée en même temps, comment peuvent-ils s’exclure mutuellement ? Les applications métier d'aujourd'hui sont généralement une architecture de microservices, ce qui signifie également qu'une application déploiera plusieurs processus si plusieurs processus doivent modifier la même ligne d'enregistrements dans MySQL, afin d'éviter les données sales causées par des opérations dans le désordre, les besoins de distribution. à introduire à ce moment-là. Le style est verrouillé. Vous voulez marquer des points

Springboot lit le fichier, mais ne peut pas accéder au dernier développement après l'avoir empaqueté dans un package jar. Il existe une situation dans laquelle Springboot ne peut pas lire le fichier après l'avoir empaqueté dans un package jar. La raison en est qu'après l'empaquetage, le chemin virtuel du fichier. n’est pas valide et n’est accessible que via le flux Read. Le fichier se trouve sous les ressources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

Lorsque Springboot+Mybatis-plus n'utilise pas d'instructions SQL pour effectuer des opérations d'ajout de plusieurs tables, les problèmes que j'ai rencontrés sont décomposés en simulant la réflexion dans l'environnement de test : Créez un objet BrandDTO avec des paramètres pour simuler le passage des paramètres en arrière-plan. qu'il est extrêmement difficile d'effectuer des opérations multi-tables dans Mybatis-plus. Si vous n'utilisez pas d'outils tels que Mybatis-plus-join, vous pouvez uniquement configurer le fichier Mapper.xml correspondant et configurer le ResultMap malodorant et long, puis. écrivez l'instruction SQL correspondante Bien que cette méthode semble lourde, elle est très flexible et nous permet de

SpringBoot et SpringMVC sont tous deux des frameworks couramment utilisés dans le développement Java, mais il existe des différences évidentes entre eux. Cet article explorera les fonctionnalités et les utilisations de ces deux frameworks et comparera leurs différences. Tout d’abord, découvrons SpringBoot. SpringBoot a été développé par l'équipe Pivotal pour simplifier la création et le déploiement d'applications basées sur le framework Spring. Il fournit un moyen rapide et léger de créer des fichiers exécutables autonomes.

1. Personnalisez RedisTemplate1.1, mécanisme de sérialisation par défaut RedisAPI. L'implémentation du cache Redis basée sur l'API utilise le modèle RedisTemplate pour les opérations de mise en cache des données. Ici, ouvrez la classe RedisTemplate et affichez les informations sur le code source de la classe. Déclarer la clé, diverses méthodes de sérialisation de la valeur, la valeur initiale est vide @NullableprivateRedisSe

Dans les projets, certaines informations de configuration sont souvent nécessaires. Ces informations peuvent avoir des configurations différentes dans l'environnement de test et dans l'environnement de production, et peuvent devoir être modifiées ultérieurement en fonction des conditions commerciales réelles. Nous ne pouvons pas coder en dur ces configurations dans le code. Il est préférable de les écrire dans le fichier de configuration. Par exemple, vous pouvez écrire ces informations dans le fichier application.yml. Alors, comment obtenir ou utiliser cette adresse dans le code ? Il existe 2 méthodes. Méthode 1 : Nous pouvons obtenir la valeur correspondant à la clé dans le fichier de configuration (application.yml) via le ${key} annoté avec @Value. Cette méthode convient aux situations où il y a relativement peu de microservices. Méthode 2 : En réalité. projets, Quand les affaires sont compliquées, la logique
