J'ai rencontré de nombreux problèmes lors de l'utilisation de Springboot pour télécharger des fichiers. Donc, après avoir lu de nombreux articles de blog, j'ai finalement amélioré la fonction de téléchargement en conséquence, donc je l'ai enregistré ici pour ma future critique.
Tout d'abord, nous créons un projet Springboot standard. L'IDE utilisée ici est Intellij Idea. Pour une configuration facile, le fichier de configuration par défaut est remplacé par application.yml.
1. La fonction de téléchargement de fichiers est effectuée dans index.html. La méthode de téléchargement de fichiers utilisé ici est ajax. Bien sûr, vous pouvez également utiliser des fichiers de formulaires traditionnels pour télécharger en fonction de vos exigences spécifiques.
<! Doctype html> <html lang = "en"> <éad> <meta charset = "utf-8"> <tight> Test de téléchargement </ title> <script type = "text / javascrip <Button id = "upload" onClick = "DouPLOAD ()"> upload </utton> <Progress Id = "ProgressBar" value = "0" max = "100"> </grarshing> <cript> function Doupload () {var FileoBj = document.getElementById ("file"). Files [0]; // js get file objet var fileController = "/ upload"; // reçoit l'adresse d'arrière-plan du fichier téléchargé // objet formdata var forme = new formData (); form.append ("fichier", fileObj); // xmlHttpRequest objet var xhr = new xmlHttpRequest (); // Ajouter la fonction de traitement de retour xhr.onreadystateChange = function () {if (this.readystate == 4 && this.status == 200) {var b = this.ResponSeText; if (b == "Success") {alert ("Télécharger réussi!"); } else {alert ("téléchargement a échoué!"); }}}}; xhr.open ("Post", FileController, true); // Utiliser la barre de progression pour enregistrer le téléchargement de progrès xhr.upload.addeventListener ("Progress", ProgressFunction, false); xhr.send (formulaire); } fonction ProgressFunction (EVT) {var ProgressBar = document.getElementById ("ProgressBar"); var perctagediv = document.getElementById ("pourcentage"); if (evt.Lengthcompitable) {ProgressBar.max = evt.Total; ProgressBar.Value = evt.loaded; perdancediv.innerhtml = math.round (evt.loaded / evt.total * 100) + "%"; }} </ script> </ body> </html> 2. Ajouter une API de téléchargement de fichiers dans le maître-contrôleur et renvoyer les résultats de téléchargement
@Postmapping ("/ upload") @ResponseBody public String upload (httpServleRequest request, @RequestParam ("File") Fichier multipartfile) {String path = "e: // upload //"; String filename = file.getoriginalFileName (); System.out.println (nom de fichier); Fichier TargetFile = nouveau fichier (chemin); if (! TargetFile.exists ()) {TargetFile.mkDirs (); } Fichier SaveFile = nouveau fichier (path + nom de fichier); // Enregistrer Try {file.transferto (sauvegarde); retourner le "succès"; } catch (exception e) {e.printStackTrace (); retourner "échouer"; }}À l'heure actuelle, nous effectuons des tests et nous pouvons constater que le téléchargement de fichiers a été terminé.
Plusieurs fois, lorsque nous téléchargeons des fichiers, en particulier lors de l'ouverture de la fonction de téléchargement de fichiers vers les utilisateurs ordinaires, nous devons contrôler le format du fichier téléchargé pour empêcher les pirates de télécharger des scripts virus. La façon d'intercepter simplement le type de nom de fichier est très facile à casser. Le téléchargeur n'a besoin que de modifier le virus en nom de fichier pour terminer le téléchargement.
À l'heure actuelle, nous pouvons lire l'en-tête de fichier hexadécimal du fichier pour déterminer le format vrai du fichier.
Parce que nous avons constaté que lorsque nous lisons les données binaires du fichier et les convertissons en hexadécimal, les données d'en-tête de fichier du même type de fichier sont les mêmes, et même si son suffixe est modifié, ces données ne changent pas. Par exemple, l'en-tête de fichier du fichier PNG est "89504e47".
Tout d'abord, nous lisons les données du fichier
classe publique FileUtil {public static String getFileHeader (fichier multipartFile) {inputStream est = null; String Value = NULL; try {is = file.getInputStream (); octet [] b = nouveau octet [4]; is.read (b, 0, b.length); valeur = byTestoHExString (b); } catch (exception e) {} enfin {if (null! = is) {try {is.close (); } catch (ioException e) {}} valeur de retour; } private static String byTestoHExString (byte [] src) {StringBuilder builder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } String hv; for (int i = 0; i <src.length; i ++) {hv = Integer.tohexString (src [i] & 0xff) .touppercase (); if (hv.length () <2) {builder.append (0); } builder.append (hv); } System.out.println (builder.toString ()); retour builder.toString (); }}Puis passer l'appel dans l'API téléchargée du fichier
Fileutil.getFileHeader (fichier)
Pour le moment, nous n'avons qu'à effectuer une comparaison de chaînes simples et à déterminer si la valeur de retour de l'appel est "89504e47", et nous pouvons savoir si le téléchargement est un fichier PNG.
Jetons un coup d'œil à Java pour obtenir et juger des informations d'en-tête
import java.io.fileInputStream; Importer java.io.ioException; import java.util.hashmap; / ** * Informations d'en-tête de fichier Get and Judge * * @author sud * * / classe publique GetTypeByhead {// Informations d'en-tête de fichier de cache - Informations d'en-tête de fichier public static final hashmap <string, string> mFileTypes = new HashMap <String, String> (); statique {// images mFileTypes.put ("ffd8ff", "jpg"); mFileTypes.put ("89504e47", "png"); mFileTypes.put ("47494638", "gif"); mFileTypes.put ("49492a00", "ail"); mFileTypes.put ("424d", "bmp"); // mFileTypes.put ("41433130", "dwg"); // Cad mFileTypes.put ("38425053", "PSD"); mFileTypes.put ("7b5c727466", "rtf"); // Journal mFileTypes.put ("3c3f786d6c", "xml"); mFileTypes.put ("68746d6c3e", "html"); mFileTypes.put ("44656c69766572792d646174653a", "eml"); // Email MFileTypes.put ("D0CF11E0", "DOC"); mFileTypes.put ("5374616e64617264204a", "mdb"); mFileTypes.put ("252150532d41646f6265", "ps"); mFileTypes.put ("255044462d312e", "pdf"); mFileTypes.put ("504b0304", "docx"); mFileTypes.put ("52617221", "rar"); mFileTypes.put ("57415645", "wav"); mFileTypes.put ("41564920", "avi"); mFileTypes.put ("2e524d46", "rm"); mFileTypes.put ("000001ba", "mpg"); mFileTypes.put ("000001b3", "mpg"); mFileTypes.put ("6d6f6f76", "mov"); mFileTypes.put ("3026b2758e66cf11", "asf"); mFileTypes.put ("4d546864", "mid"); mFileTypes.put ("1f8b08", "gz"); mFileTypes.put ("4d5a9000", "exe / dll"); mFileTypes.put ("75736167", "txt"); } / ** * Obtenez des informations d'en-tête de fichier basées sur le chemin du fichier * * @param filepath * cheminée de fichier * @return Informations d'en-tête de fichier * / public static String getFileType (String filepath) {System.out.println (getFileHeader (filepath)); System.out.println (mFileTypes.get (getFileHeader (filepath))); return mFileTypes.get (getFileHeader (filepath)); } / ** * Obtenez des informations d'en-tête de fichier basées sur le chemin du fichier * * @param filepath * Path du fichier * @return Informations d'en-tête de fichier * / public static String getFileHeader (String filepath) {fileInputStream is = null; String Value = NULL; try {is = new FileInputStream (filePath); octet [] b = nouveau octet [4]; / * * int lien () Lisez un octet de données à partir de ce flux d'entrée. Int lecture (octet [] b) Lisez jusqu'à un tableau d'octets de données des octets B.Length * de ce flux d'entrée. int lien (octet [] b, int off, int len) * Lisez les octets Len de données de ce flux d'entrée dans un tableau d'octets. * / is.read (b, 0, b.length); valeur = byTestoHExString (b); } catch (exception e) {} enfin {if (null! = is) {try {is.close (); } catch (ioException e) {}}} valeur de retour; } / ** * Convertir le tableau d'octet du fichier pour lire les informations d'en-tête de fichier en un type de chaîne représentant * * @param information src * BYTE du fichier pour lire les informations d'en-tête de fichier * @return des informations d'en-tête de fichier * / stringbuilder static byTestoHExString (byt [] src) {StringBuilder Builder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } String hv; pour (int i = 0; i <src.length; i ++) {// renvoie une représentation de chaîne d'un paramètre entier dans hexaDecimal (base 16) entier non signé et le convertir en uppercase hv = Integer.tohexString (src [i] & 0xff) .toupperCase (); if (hv.length () <2) {builder.append (0); } builder.append (hv); } System.out.println (builder.toString ()); retour builder.toString (); } public static void main (String [] args) lève une exception {final string filetype = getFileType ("d: //ry4s_java.dll"); System.out.println (FileType); }}Résumer
Ce qui précède est le contrôle de téléchargement de fichiers Springboot et les informations d'en-tête de fichier Java et de jugement vous sont présentées. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!