Ich habe viele Probleme gestoßen, als ich Springboot zum Hochladen von Dateien verwendet habe. Nachdem ich viele Blog -Beiträge gelesen hatte, habe ich die Upload -Funktion endlich entsprechend verbessert, also habe ich sie hier für meine zukünftige Bewertung aufgezeichnet.
Erstens erstellen wir ein Standard -Springboot -Projekt. Die hier verwendete Ideen ist die Intellij -Idee. Für eine einfache Konfiguration wird die Standardkonfigurationsdatei durch application.yml ersetzt.
1. Die Datei -Upload -Funktion wird in index.html durchgeführt. Die hier verwendete Datei -Upload -Methode ist AJAX. Natürlich können Sie auch herkömmliche Formulardateien verwenden, um entsprechend Ihren spezifischen Anforderungen hochzuladen.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Upload test</title> <script type="text/javascript" src="js/jquery-3.2.1.min.js"></script> </head> <body> <input id="file" type="file" name="file"/> <br/> <button id = "upload" onclick = "doupload ()"> Upload </button> <progresor id = "progressBar" value = "0" max = "100"> </progresh> <script> Funktion doupload () {var fileObj = document.getElementById ("Datei"). Dateien [0]. // js Dateiobjekt Var FileController = "/Upload" erhalten; // Empfangen Sie die Hintergrundadresse der hochgeladenen Datei // FormData -Objekt var Form = new FormData (); Form.Append ("Datei", FileObj); // xmlhttpRequest -Objekt var xhr = new xmlHttprequest (); // Rückgabeverarbeitungsfunktion addieren xhr.onReadyStatechange = function () {if (this.readyState == 4 && this.status == 200) {var b = this.responsetext; if (b == "Erfolg") {alert ("erfolgreich hochladen!"); } else {alert ("Upload fehlgeschlagen!"); }}}}; xhr.open ("post", filecontroller, true); // Fortschrittsbalken verwenden, um den Upload -Fortschritt XHR.Upload.AdDeVentListener ("Progress", ProgressFunction, False) aufzuzeichnen; Xhr.Send (Form); } function ProgressFunction (evt) {var progresorBar = document.getElementById ("progreshingBar"); var prozentionagediv = document.getElementById ("Prozentsatz"); if (evt.lengthComputable) {progressBar.max = evt.total; progresorBar.Value = evt.Loaded; prozentualagediv.innerhtml = math.round (evt.Loaded / evt.total * 100) + "%"; }} </script> </body> </html> 2. Fügen Sie die Datei -Upload -API in MainController hinzu und senden
@Postmapping ("/upload") @ResponseBody Public String Upload (httpServletRequest -Anforderung, @RequestParam ("Datei") MultiPartFile -Datei) {String path = "e: // upload //"; String Dateiname = Datei.getOriginalFileName (); System.out.println (Dateiname); Datei targetFile = neue Datei (Pfad); if (! targetFile.exists ()) {targetFile.mkdirs (); } Datei SaveFile = neue Datei (Pfad+Dateiname); // speichern try {file.transferto (SaveFile); zurück "Erfolg"; } catch (Ausnahme e) {e.printstacktrace (); zurück "scheitern"; }}Zu diesem Zeitpunkt führen wir Tests durch und können feststellen, dass das Datei -Upload abgeschlossen wurde.
Wenn wir Dateien hochladen, insbesondere beim Öffnen der Datei -Upload -Funktion für normale Benutzer, müssen wir das Format der hochgeladenen Datei steuern, um Hacker daran zu hindern, Virus -Skripte hochzuladen. Die Art und Weise, wie der Dateinamen -Typ einfach abfasst, ist sehr einfach zu knacken. Der Uploader muss nur das Virus in den Dateinamen ändern, um das Upload zu vervollständigen.
Zu diesem Zeitpunkt können wir den Hexadezimal -Datei -Header der Datei lesen, um das wahre Format der Datei zu bestimmen.
Da wir festgestellt haben, dass beim Lesen der Binärdaten der Datei und der Umwandlung in Hexadezimal die Datei -Header -Daten derselben Dateiart gleich sind, und selbst wenn sich das Suffix geändert wird, ändert sich diese Daten nicht. Beispielsweise lautet der Datei -Header der PNG -Datei "89504E47".
Zuerst lesen wir die Dateidaten
public class FileUtil {public static String getFileHeader (MultipartFile -Datei) {InputStream is = null; String value = null; try {is = file.getInputStream (); Byte [] B = neues Byte [4]; is.read (b, 0, B.Length); value = byestohexstring (b); } catch (Ausnahme e) {} endlich {if (null! = is) {try {is.close (); } catch (ioException e) {}} Rückgabewert; } private statische String byTestohexString (byte [] src) {StringBuilder Builder = new StringBuilder (); if (src == null || src.length <= 0) {return null; } String hv; für (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 ()); return Builder.toString (); }}Gehen Sie dann den Anruf in der hochgeladenen Datei API durch
FileUtil.getFileHeader (Datei)
Zu diesem Zeitpunkt müssen wir nur einen einfachen String -Vergleich durchführen und feststellen, ob der Rückgabewert des Anrufs "89504E47" lautet, und wir können wissen, ob das Hochgeladen eine PNG -Datei ist.
Schauen wir uns Java an, um die Information von Dateien Header zu erhalten und zu beurteilen
import Java.io.FileInputStream; importieren java.io.ioException; import Java.util.hashMap; / ** * Get and Judge Datei Header -Informationen * * @Author Sud * */ öffentliche Klasse GettTypebyhead {// Cache -Datei -Header -Informationen - Datei -Header -Informationen public static Final Hashmap <String, String> mfiletypes = new Hashmap <String, String> (); static {// Bilder mfiletypes.put ("ffd8ff", "jpg"); Mfiletypes.put ("89504e47", "PNG"); Mfiletypes.put ("47494638", "GIF"); Mfiletypes.put ("49492a00", "Tif"); Mfiletypes.put ("424d", "Bmp"); // mfiletypes.put ("41433130", "DWG"); // CAD mFiletypes.put ("38425053", "PSD"); Mfiletypes.put ("7B5C727466", "RTF"); // Tagebuch mfiletypes.put ("3C3F786D6C", "XML"); Mfiletypes.put ("68746D6C3E", "HTML"); Mfiletypes.put ("44656c69766572792d646174653a", "EML"); // E -Mail 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"); } / ** * Datei -Header -Informationen basierend auf Dateipfad * * @param filepath * Dateipfad * @return Datei -Header -Informationen * / public static String getFileType (String filepath) {System.out.println (GetFileHeeder (FilePath)); System.out.println (Mfiletypes.get (GetFileHeader (filepath))); return mFiletypes.get (getFileHeader (filepath)); } / ** * Datei -Header -Informationen basierend auf Dateipfad * * @param filepath * Dateipfad * @return Datei -Header -Informationen * / public static String getFileHeader (String -Filepath) {FileInputStream is = null; String value = null; try {is = new FileInputStream (filepath); Byte [] B = neues Byte [4]; / * * int read () Lesen Sie ein Datenbyte aus diesem Eingabestream. int read (byte [] b) lesen Sie bis zu einem Byte -Array von Daten von B.Length * -Bytes aus diesem Eingabestream. int read (byte [] b, int off, int len) * lese bis zu len -bytes von diesem Eingabestream in ein Byte -Array. */ is.read (b, 0, B.Length); value = byestohexstring (b); } catch (Ausnahme e) {} endlich {if (null! = is) {try {is.close (); } catch (ioException e) {}}} Rückgabewert; } / ** * Konvertieren Sie das Byte -Array der Datei, um die Datei -Header -Informationen in einen String -Typ zu lesen, der * * @param src * Byte -Array der Datei darstellt, um die Datei -Header -Informationen zu lesen. if (src == null || src.length <= 0) {return null; } String hv; für (int i = 0; i <src.length; i ++) {// eine String -Darstellung eines Integer -Parameters in hexadezimal (Basis 16) unsigned Integer zurückgeben und in Großbuchstaben hv = integer.tohexString (Src [i] & 0xffl) .Touppercase (); if (hv.length () <2) {builder.Append (0); } builder.append (hv); } System.out.println (builder.toString ()); return Builder.toString (); } public static void main (String [] args) löst Ausnahme aus {Final String fileType = getFileType ("d: //ry4s_java.dll"); System.out.println (Filetype); }}Zusammenfassen
Das obige ist die Ihnen vorgelegte Springboot -Datei -Upload -Steuerung und Java -Erwerbs- und Urteilsdatei -Header -Informationen. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!