واجهت العديد من المشكلات عند استخدام Springboot لتحميل الملفات. لذلك بعد قراءة الكثير من منشورات المدونة ، قمت أخيرًا بتحسين وظيفة التحميل وفقًا لذلك ، لذلك قمت بتسجيلها هنا لمراجعتي المستقبلية.
أولاً ، نقوم بإنشاء مشروع SPRINGBOOT قياسي. IDE المستخدمة هنا هي فكرة Intellij. لسهولة التكوين ، يتم استبدال ملف التكوين الافتراضي بـ Application.yml.
1. يتم تنفيذ وظيفة تحميل الملف في index.html. طريقة تحميل الملف المستخدمة هنا هي AJAX. بالطبع ، يمكنك أيضًا استخدام ملفات النماذج التقليدية للتحميل وفقًا لمتطلباتك المحددة.
<! doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> اختبار التحميل </title> <script type = "text/javaScript" src = "file =" file = "file =" file = "file =" file = <br/> <button id = "expload" onClick = "doupload ()"> التحميل </button> <progress id = "progressBar" value = "0" max = "100"> </progress> <script> function doupload () {var fileObj = document.getElementByid ("file"). file [0] ؛ // js get file object var fileController = "/expload" ؛ // تلقي عنوان الخلفية للملف المحمّل // formdata Object var form = new formData () ؛ Form.Append ("file" ، fileObj) ؛ // xmlhttprequest object var xhr = new xmlhttprequest () ؛ // إضافة وظيفة معالجة الإرجاع XHR.OnReadyStateChange = function () {if (this.readyState == 4 && this.status == 200) {var b = this.responsetext ؛ if (b == "Success") {Alert ("تحميل ناجح!") ؛ } آخر {Alert ("فشل التحميل!") ؛ }}}} ؛ XHR.Open ("post" ، fileController ، true) ؛ // استخدم شريط التقدم لتسجيل التقدم التحديث XHR.UPLOAD.AdDeventListener ("Progress" ، ProgressFunction ، false) ؛ XHR.Send (form) ؛ } وظيفة progressFunction (evt) {var progressBar = document.getElementById ("ProgressBar") ؛ var في المئة = document.getElementById ("النسبة المئوية") ؛ if (evt.lengthComputable) {progressBar.Max = evt.total ؛ ProgressBar.value = evt.loaded ؛ في المئة. }} </script> </body> </html> 2. أضف واجهة برمجة تطبيقات تحميل الملف في MainController وإرجاع نتائج التحميل
postmapping ("/expload") recponsebody string repload (httpservletrequest request ، requestparam ("file") ملف multipartfile) {string path = "e: // upload //" ؛ اسم ملف السلسلة = file.getoriginalfilename () ؛ system.out.println (اسم الملف) ؛ ملف TargetFile = ملف جديد (path) ؛ if (! targetfile.exists ()) {targetfile.mkdirs () ؛ } ملف SaveFile = ملف جديد (مسار+اسم الملف) ؛ // Save Try {file.transferto (SaveFile) ؛ إرجاع "النجاح" ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ العودة "فشل" ؛ }}في هذا الوقت ، نجري اختبارات ويمكننا أن نجد أن تحميل الملف قد اكتمل.
في كثير من الأحيان ، عندما نقوم بتحميل الملفات ، خاصة عند فتح وظيفة تحميل الملف للمستخدمين العاديين ، نحتاج إلى التحكم في تنسيق الملف الذي تم تحميله لمنع المتسللين من تحميل البرامج النصية للفيروسات. من السهل جدًا تحديد طريقة الاعتراض على نوع اسم الملف. يحتاج جهاز التحميل فقط إلى تغيير الفيروس إلى اسم ملف لإكمال التحميل.
في هذا الوقت ، يمكننا قراءة رأس الملف السداسي عشر للملف لتحديد التنسيق الحقيقي للملف.
نظرًا لأننا وجدنا أنه عندما نقرأ البيانات الثنائية للملف وتحويلها إلى سداسي عشري ، فإن بيانات رأس الملف لنفس النوع من الملف هي نفسها ، وحتى إذا تم تغيير لاحقة ، فلن تتغير هذه البيانات. على سبيل المثال ، رأس ملف ملف PNG هو "89504E47".
أولاً ، نقرأ بيانات الملف
الفئة العامة FileUtil {public static string getFileHeader (ملف multipartfile) {inputStream is = null ؛ قيمة السلسلة = فارغة ؛ حاول {iS = file.getInputStream () ؛ بايت [] ب = بايت جديد [4] ؛ IS.Read (B ، 0 ، B.Length) ؛ القيمة = bytestohexstring (b) ؛ } catch (استثناء e) {} أخيرًا {if (null! = is) {try {is.close () ؛ } catch (ioException e) {}} قيمة الإرجاع ؛ } سلسلة ثابتة خاصة bytestoHexString (byte [] src) {StringBuilder builder = new StringBuilder () ؛ if (src == null || src.length <= 0) {return null ؛ } سلسلة hv ؛ لـ (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 ()) ؛ إرجاع builder.toString () ؛ }}ثم قم بإجراء المكالمة في ملف API تم تحميله
fileutil.getFileHeader (ملف)
في هذا الوقت ، نحتاج فقط إلى إجراء مقارنة سلسلة بسيطة وتحديد ما إذا كانت قيمة إرجاع المكالمة هي "89504E47" ، ويمكننا معرفة ما إذا كان التحميل هو ملف PNG.
دعنا نلقي نظرة على جافا للحصول على معلومات رأس الملف والحكم
استيراد java.io.fileInputStream ؛ استيراد java.io.ioException ؛ استيراد java.util.hashmap ؛ / ** * احصل على معلومات رأس الملف والحكم * * Author SUD * */ الفئة العامة gettypebyhead {// معلومات رأس ذاكرة التخزين المؤقت - معلومات رأس الملف العامة HASHMAP Final Final <String ، String> mfiletypes = new hashmap <string ، string> () ؛ static {// images 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 ("44656C6976572792D646174653A" ، "EML") ؛ // البريد الإلكتروني 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") ؛ } / ** * احصل على معلومات رأس الملف استنادًا إلى مسار الملف * * param filepath * مسار الملف * @RETURN معلومات رأس * / سلسلة ثابتة عامة getFiLetype (سلسلة filepath) {system.out.println (getFileHeader (filepath)) ؛ system.out.println (mfiLetypes.get (getFileHeader (filepath))) ؛ return mfiletypes.get (getFileHeader (filepath)) ؛ } / ** * احصل على معلومات رأس الملف استنادًا إلى مسار الملف * * param filepath * مسار الملف * @RETURN معلومات الرأس * / سلسلة ثابتة getFileHeader (سلسلة FilePath) {fileInputStream = null ؛ قيمة السلسلة = فارغة ؛ حاول {IS = جديد fileInputStream (filePath) ؛ بايت [] ب = بايت جديد [4] ؛ / * * int read () اقرأ بايت بيانات من دفق الإدخال هذا. int read (byte [] b) اقرأ ما يصل إلى مجموعة بايت من بيانات B.Length * bytes من دفق الإدخال هذا. int read (byte [] b ، int off ، int len) * اقرأ ما يصل إلى بايت من البيانات من دفق الإدخال هذا إلى صفيف بايت. */ iS.Read (B ، 0 ، B.Length) ؛ القيمة = bytestohexstring (b) ؛ } catch (استثناء e) {} أخيرًا {if (null! = is) {try {is.close () ؛ } catch (ioException e) {}}} قيمة الإرجاع ؛ } / ** * قم بتحويل صفيف البايت للملف لقراءة معلومات رأس الملف في نوع سلسلة يمثل * * param src * byte array من الملف لقراءة معلومات رأس الملف * معلومات رأس العودة * / private static string bytestohexstring (byte [] src) if (src == null || src.length <= 0) {return null ؛ } سلسلة hv ؛ لـ (int i = 0 ؛ i <src.length ؛ i ++) {// إرجاع تمثيل سلسلة لمعلمة عدد صحيح في hexadecimal (base 16) integer غير موقعة وتحويله إلى hv الكبير = عدد صحيح. if (hv.length () <2) {builder.append (0) ؛ } builder.append (hv) ؛ } system.out.println (builder.toString ()) ؛ إرجاع builder.toString () ؛ } public static void main (string [] args) يلقي استثناء {Final String fileType = getFiLetype ("d: //ry4s_java.dll") ؛ system.out.println (filetype) ؛ }}لخص
ما سبق هو التحكم في تحميل ملف Springboot ومعلومات رأس الحصول على ملف Java وملف الحكم. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!