Saya mengalami banyak masalah saat menggunakan Springboot untuk mengunggah file. Jadi setelah membaca banyak posting blog, saya akhirnya meningkatkan fungsi unggahan yang sesuai, jadi saya merekamnya di sini untuk ulasan saya di masa depan.
Pertama, kami membuat proyek springboot standar. Ide yang digunakan di sini adalah ide IntelliJ. Untuk konfigurasi yang mudah, file konfigurasi default diganti dengan application.yml.
1. Fungsi unggahan file dilakukan di index.html. Metode Upload File yang digunakan di sini adalah AJAX. Tentu saja, Anda juga dapat menggunakan file formulir tradisional untuk mengunggah sesuai dengan persyaratan spesifik Anda.
<!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/> <tombol id = "unggah" ontClick = "doubload ()"> Unggah </button> <progress id = "progressBar" value = "0" max = "100"> </progress> <script> function doubleAd () {var fileobj = document.getElementById ("file"). File [0]; // js dapatkan file objek var filecontroller = "/unggah"; // menerima alamat latar belakang file yang diunggah // objek formdata var form = formdata baru (); Form.Append ("File", Fileobj); // objek xmlHttpRequest var xhr = new xmlhttpRequest (); // Tambahkan fungsi pemrosesan pengembalian xhr.onreadystatechange = function () {if (this.readystate == 4 && this.status == 200) {var b = this.Responsetext; if (b == "sukses") {alert ("Unggah sukses!"); } else {alert ("Unggah gagal!"); }}}}; xhr.open ("post", filecontroller, true); // Gunakan bilah progress untuk merekam kemajuan unggahan xhr.upload.addeventListener ("progress", progressFunction, false); xhr.send (form); } function progressFunction (evt) {var progressBar = document.geteLementById ("progressBar"); var persentagediv = document.getElementById ("persentase"); if (evt.lengthcomputable) {progressBar.max = evt.total; progressBar.Value = evt.Loaded; persentagediv.innerHtml = math.round (evt.Loaded / evt.total * 100) + "%"; }} </script> </body> </html> 2. Tambahkan file unggahan API di MainController dan kembalikan hasil unggah
@PostMapping ("/unggah") @ResponseBody Public String Unggah (permintaan httpservletRequest, @RequestParam ("file") file multipartfile) {string path = "e: // unggah //"; String filename = file.getoriginalFileName (); System.out.println (nama file); File targetFile = file baru (path); if (! TargetFile.exists ()) {targetfile.mkdirs (); } File saveFile = file baru (path+fileName); // simpan coba {file.transferto (saveFile); mengembalikan "kesuksesan"; } catch (Exception e) {E.PrintStackTrace (); mengembalikan "gagal"; }}Pada saat ini, kami melakukan tes dan kami dapat menemukan bahwa unggahan file telah selesai.
Sering kali, ketika kami mengunggah file, terutama saat membuka fungsi unggahan file kepada pengguna biasa, kami perlu mengontrol format file yang diunggah untuk mencegah peretas mengunggah skrip virus. Cara sekadar mencegat jenis nama file sangat mudah untuk retak. Pengunggah hanya perlu mengubah virus ke nama file untuk menyelesaikan unggahan.
Pada saat ini, kita dapat membaca header file hexadecimal file untuk menentukan format file yang sebenarnya.
Karena kami menemukan bahwa ketika kami membaca data biner file dan mengonversinya menjadi hexadecimal, data header file dari jenis file yang sama adalah sama, dan bahkan jika sufiksnya diubah, data ini tidak akan berubah. Misalnya, header file file PNG adalah "89504E47".
Pertama, kami membaca data file
Public Class Fileutil {public static string getFileHeader (file multipartFile) {inputStream adalah = null; Nilai string = null; coba {is = file.getInputStream (); byte [] b = byte baru [4]; IS.Read (B, 0, B.Length); value = bytestoHexString (b); } catch (exception e) {} akhirnya {if (null! = is) {try {isClose (); } catch (ioException e) {}} nilai pengembalian; } private static string bytestoHexString (byte [] src) {stringBuilder builder = stringBuilder baru (); if (src == null || src.length <= 0) {return null; } String hv; untuk (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 (); }}Kemudian lakukan panggilan di file API yang diunggah
Fileutil.getFileHeader (file)
Pada saat ini, kita hanya perlu melakukan perbandingan string sederhana dan menentukan apakah nilai pengembalian panggilan adalah "89504E47", dan kita dapat tahu apakah pengunggahannya adalah file PNG.
Mari kita lihat Java untuk mendapatkan dan menilai informasi header file
impor java.io.fileInputStream; impor java.io.ioException; impor java.util.hashmap; / ** * Dapatkan dan menilai informasi header file * * @author sud * */ kelas publik getTypeByhead {// informasi header file cache - informasi header file public static final hashMap <string, string> mfiletypes = hashmap baru <string, string> (); static {// gambar 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"); // Diary 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"); } / ** * Dapatkan informasi header file berdasarkan jalur file * * @param filepath * path file * @return informasi header file * / string statis publik getFileType (string filePath) {system.out.println (getFileHeader (filepath)); System.out.println (mfiletypes.get (getFileHeader (filepath))); return mfiletypes.get (getFileHeader (filepath)); } / ** * Dapatkan informasi header file berdasarkan jalur file * * @param filepath * path file * @return informasi header file * / string statis publik getFileHeader (string filePath) {fileInputStream is = null; Nilai string = null; coba {is = new FileInputStream (FilePath); byte [] b = byte baru [4]; / * * int read () Baca byte data dari aliran input ini. int read (byte [] b) Baca hingga array byte data b.length * byte dari aliran input ini. int read (byte [] b, int off, int len) * Baca hingga len byte data dari aliran input ini ke array byte. */ is.read (b, 0, b.length); value = bytestoHexString (b); } catch (exception e) {} akhirnya {if (null! = is) {try {isClose (); } catch (ioException e) {}}} nilai pengembalian; } /** * Convert the byte array of the file to read the file header information into a string type representing * * @param src * byte array of the file to read the file header information* @return File header information*/ private static String bytesToHexString(byte[] src) { StringBuilder builder = new StringBuilder(); if (src == null || src.length <= 0) {return null; } String hv; untuk (int i = 0; i <src.length; i ++) {// mengembalikan representasi string dari parameter integer dalam hexadecimal (basis 16) integer yang tidak ditandatangani dan mengubahnya menjadi huruf besar hv = integer.tohexstring (src [i] & 0xff) .tuppercase ();; if (hv.length () <2) {builder.append (0); } builder.append (hv); } System.out.println (builder.toString ()); return builder.tostring (); } public static void main (string [] args) melempar Exception {final string filetype = getFileType ("d: //ry4s_java.dll"); System.out.println (FileType); }}Meringkaskan
Di atas adalah kontrol unggahan file springboot dan akuisisi java dan informasi header file penilaian yang diperkenalkan kepada Anda. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!