تحميل الملفات والتنزيل هي المشكلات الشائعة التي واجهتها في تطوير الويب. في الأيام القليلة الماضية ، تم استخدام تنزيل الملف في المشروع. لقد أخذت أيضًا بعض الملاحظات بطريقة مبعثرة من قبل. اليوم سوف أقوم بتنظيمه. يحتاج تحميل الملفات إلى مزيد من الاختبارات ، دعنا نتحدث عن تنزيل الملف أولاً.
1. عملية معالجة تنزيل الملف
عملية تنزيل الملف واضحة جدًا في الواقع ، أي:
1. تحديد موقع الملفات بناءً على اسم الملف أو مسار الملف. تعتمد الإستراتيجية المحددة بشكل أساسي على احتياجاتك الخاصة. باختصار ، مطلوب المسار الكامل للملفات التي يمكن للنظام العثور عليها.
2. احصل على دفق الإدخال واحصل على دفق الإدخال من الملف الهدف.
3. احصل على دفق الإخراج واحصل على دفق الإخراج من الاستجابة.
4. اقرأ الملف من دفق الإدخال وإخراج الملف من خلال دفق الإخراج. هذه هي عملية تنفيذ التنزيل الحقيقية.
5. قم بإيقاف تشغيل دفق IO.
هذه هي العملية الرئيسية ، وهناك بعض إعدادات السمات اللازمة ، مثل نوع المحتوى الأكثر أهمية في ملف الإعداد ، إلخ.
2. لا تتحدث بعد الآن ، أضف الرمز
لقد فعلت ذلك مع SpringMVC ، ولكن في الواقع ، ينطبق الشيء نفسه على أشياء أخرى. أحتاج بشكل رئيسي إلى كائن httpservletresponse وملف هدف صالح.
1. رمز مكتب الاستقبال
/** قم بتنزيل الملف الذي تم تحميله*/وظيفة تنزيل fromupload (filename) {window.location.href = path + "/download؟ dir = upload & filename =" + encodeuri (encodeuri (path +) "/تنزيل؟ dir = download & filename ="+encodeuri (encodeuri (filename)) ؛}2. رمز وحدة التحكم
/*** تنزيل الملف (تنزيل من مسار التحميل)** request request* param استجابة* throws ioException*/ @reponseBody @requestmapping (value = "/download") public void downloadFile (httpservletrequest request ، httpservlespons "UTF-8") ؛/** تقييد الملفات فقط في مجلدات التحميل والتنزيل يمكن تنزيلها*/string foldername = "download" ؛ if (! stringUtils.isempty (model.getdir ()) request.getSession (). getServletContext (). getRealPath ("/")+ "/web-inf/"+ foldername+ "/"+ filename ؛ fileTools.DownloadFile (request ، response ، fileBuTePath) ؛ log.warn ("userid: (طلب.منطق التنزيل هنا هو أن مكتب الاستقبال يحتاج فقط إلى طلب/تنزيل وإعطاء معلمات اسم الملف. لتجنب الكود المشوهة الصيني ، عند استخدام اسم الملف المقدمة كمعلمة ، فإنه يستخدم encodeuri () JS لتغييره إلى رمز Unicode ، ثم يقوم بفك تشفيره إلى الصينية. بالإضافة إلى ذلك ، نظرًا للطبيعة الخاصة للمشروع ، قد تكون الملفات التي أرغب في تنزيلها هنا في مجلدات التحميل والتنزيل ، لذلك هناك جزء من منطق الحكم هنا. بالإضافة إلى ذلك ، أقوم بتغليف كل من اسم الملف واسم المجلد المطلوب في FileModel.
3. تنزيل تنفيذ المنطق.
لا توجد خدمة هنا ، ولكن يتم تنفيذها مباشرة باستخدام طرق ثابتة.
/*** حدد اسم التنزيل عند تنزيل الملف** @param طلب* httpservletrequest* param استجابة* httpservletresponse* param filepath* المسار الكامل للملف* param filenm السلسلة filepath ، اسم ملف السلسلة) يلقي ioException {bufferedInputStream bis = null ؛ bufferedoutputstream bos = null ؛ bis = جديد bufferedInputStream (fileInputStream جديد (filePath)) ؛ bos = جديد bufferedOutStream (response.getOutputStream ()) ملف (filepath) .length () ؛ response.setcharacterencoding ("utf-8") ؛ reponse.setContentType ("multipart/form-data") ؛/** حل المشكلة الصينية المشتركة لكل متصفح*/string useragent = request.getheader ("user-agent") ؛ by bytes = useragent. filename.getBytes (): filename.getBytes ("UTF-8") ؛ // filename.getBytes ("UTF-8") يتعامل مع مشاكل الكود المخفوق في اسم ملف Safari = سلسلة جديدة (بايت "، ISO-8859-1") ؛ // جميع المتصفحات تدعم بشكل أساسي استجابة ترميز ISO. Bis.Read (Buff ، 0 ، Buff.Length))) {Bos.Write (Buff ، 0 ، bytesread) ؛} bis.close () ؛ bos.close () ؛}/*** لا يتم تحديد اسم ملف التنزيل عند تنزيل ملف** param* httpserdrequest* @parparam throws ioException*/public static void downloadFile (طلب httpservletrequest ، httpservletresponse ، string filepath) يلقي iOexception {file file = filepath)فيما يلي طريقة تنزيل تم تحميلها الزائد لحل الحاجة إلى تحديد اسم الملف أحيانًا بواسطة العميل.
3. أشياء يجب ملاحظتها
1. حول اختيار نوع MIME
لم أكن أعرف الكثير عن أنواع MIME من قبل ، لكنني وجدت أن هناك العديد من رموز المصدر التي تم تنزيلها على الإنترنت التي تحتوي على إعدادات مختلفة. هذه هي الجملة
استجابة.
لقد راجعت أن إحدى وظائف تعيين نوع MIME هنا هي إخبار متصفح العميل بمعالجة الملف المراد تنزيله في أي تنسيق. هناك العديد من التفسيرات على الموقع المقابل المحدد. إذا تم تعيين هذا النوع من الفصل الأول في هذا التنسيق ، فسيتم تطابق التنسيق بشكل عام تلقائيًا.
2. حدد اسم ملف تنزيل العميل
في بعض الأحيان قد نحتاج إلى تحديد اسم الملف عندما يقوم العميل بتنزيل الملف ، أي هذا الرمز
استجابة.
يمكن تخصيص اسم الملف فيه. لا ينبغي نقل الجزء الأمامي.
3. حل مشكلة الصينية المشوهة
من الشائع جدًا أن يتم تشويه الملفات الصينية. عندما يتم بناء بنية نظام المشروع لأول مرة ، يجب توحيد جميع الترميزات الصينية ، بما في ذلك في المحرر والصفحة وقاعدة البيانات. يوصى بترميز UTF-8. إذا كنت تستخدم Spring ، فيمكنك أيضًا تكوين مرشح مجموعة أحرف Spring لتجنب الرمز المشتعلة الصيني.
(1) تم تشويه اسم ملف عملية تنزيل العميل
في بعض الأحيان نواجهها. عندما تعرض صفحة مكتب الاستقبال قائمة تنزيل اسم الملف الصيني ، يكون الأمر طبيعيًا ، ولكن عندما نذهب إلى الخلفية ، نجد أن اسم الملف في الطلب مشوه. في هذا الوقت ، يمكننا استخدام Encodeuri المذكورة أعلاه لحل المشكلة.
(2) اسم الملف مشوه عند تنزيل العميل وينفذ
في الاختبارات الفعلية ، وجد أنه عندما يمكن تنفيذ المتصفحات الأخرى ، قد يظهر اسم الملف الصيني تحت IE مشوهًا. رأيت مثل هذا الرمز عبر الإنترنت. بعد الاختبار ، حل مشكلة صينية مشوهة في متصفحات مختلفة.
/** حل المشكلة المشوهة الصينية لكل متصفح*/string useragent = request.getheader ("عامل المستخدم") ؛ بايت [] بايت = useragent.contains ("msie")؟ filename.getBytes (): filename.getBytes ("UTF-8") ؛ // filename.getBytes ("UTF-8") يتعامل مع المشكلة المشوهة لاسم ملف Safari = سلسلة جديدة (بايت "، ISO-8859-1") ؛ // جميع المتصفحات تدعم بشكل أساسي استجابة ISO الترميز.(3) ملف مشوه على الخادم
قد تختلف الخوادم المختلفة أيضًا اعتمادًا على النظام الأساسي ، لذلك تحتاج إلى الانتباه إليها هنا. للحصول على حلول محددة ، يرجى الرجوع إلى مقال كتبته من قبل: المعالجة الصينية المشوهة أثناء تنزيل الملف.
ما سبق هو تنزيل ملف تنفيذ الويب Java وطريقة المعالجة المشوهة التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!