يعد تحميل الملفات وتنزيلها أمرًا شائعًا جدًا أثناء التطوير. هنا ملخص موجز:
1. الشروط التي يجب استيفاءها لتحميل الملف:
أ. يجب نشر طريقة نموذج الصفحة لأن البيانات المرسلة بواسطة GET صغيرة جدًا
ب. يجب أن يكون enctype من نموذج الصفحة من نوع multipart/form-data
ج. يوفر النموذج تفاصيل تحميل رمز حقل الإدخال: في نموذج العميل: <form enctype = "multipart/form-data"/>
(إذا لم تكن هذه الخاصية متوفرة ، فسيختلف مسار الملف الذي يقرأه الخادم وفقًا للمتصفح)
Server ServleTinputStream هو = request.getInputStream () ؛ يحصل على محتوى جسم الطلب في دفق لمزيد من التحليل.
2. تفاصيل تحميل الملفات:
(1) لماذا تعيين نوع النموذج على: multipart/form-data. إنه لضبط القيمة التي تم تمريرها بواسطة هذا النموذج الذي ليس هو المفتاح = القيمة. ما تم تمريره هو رمز bytecode.
المراسلات بين النموذج والطلب:
كما هو موضح أعلاه ، يمكنك أن ترى أنه بعد تعيين نوع النموذج إلى: multipart/form-data ، يتم تهيئة الملف الذي حددته إلى ثنائي في جسم طلب HTTP ، كما هو موضح في الصورة أعلاه أسفل سلسلة عشوائية أسفل ملف تعريف الارتباط.
ولكن لاحظ أن هناك سطرين خاصين من الأحرف في ملف Bytecode مقسومًا على ملف التعريف (أي سلسلة من الأوتار العشوائية) ، وهما السطر الأول من رأس ملف المحتوى وخط الأسطر الفارغة. السطر الثالث بعد ذلك هو محتوى الملف الثنائي.
لذلك ، عندما يقبل الخادم الملفات التي تم تحميلها بواسطة العميل ، عند الحصول على الملف الثنائي في معلمات طلب HTTP ، يجب إزالة الأسطر الثلاثة الأولى.
3. تحليل ملف TXT الذي تم تحميله يدويًا:
استيراد java.io.bufferedreader ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.inputstreamread ؛ import java.io.printwriter ؛ import javax.servlet.servlexception ؛ javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛/** * إذا تم نشر نوع النموذج و enctype multipart/form-date * ، ثم يتم تمرير جميع البيانات إلى الخادم في الوضع الثنائي. * لذا فإن req.getParameter ("xxx") لاغية دائمًا. * يمكنك الحصول على البيانات فقط من خلال req.getInputStream () والحصول على بيانات النص * * Author Wangxi * */upservlet public يمتد httpservlet {public void dopost (httpletrequest req ، httpservletsponse servletexception ، ioexception String txt = req.getParameter ("txt") ؛ // الإرجاع هو null system.err.println ("txt is:"+txt) ؛ System.err.println ("==========================================") ؛ inputStream in = req.getInputStream () ؛ // byte [] b = new byte [1024] ؛ // int len = 0 ؛ inputStreamReader (in)) ؛ String FirstLine = br.readline () ؛ // اقرأ السطر الأول ، والسطر الأول هو رمز محدد ، أي اسم ملف سلسلة عشوائي = br.readline () ؛ // السطر الثاني من معلومات الملف ، واعتراض اسم الملف من filename = filename.substring (filename.lastindexof ("//")+1) ؛ Filename.SubString (0 ، filenment ()-1) ؛ بينما (data = br.readline ()! = null) {if (data.equals (firstline+"-") {break ؛ 4. استخدم apache-filepload لمعالجة تحميل الملفات:
الإطار: يشير إلى تغليف الأعمال التي غالباً ما يعالجها المستخدمون في رمز. اجعل من السهل على المستخدمين الاتصال.
المكون (الإطار) الذي يقوم حاليًا بتحميل الملف:
Apache-fileupload-
Orialiy cos 2008 () -
JSP-Smart-Upload 200m.
قم بتحميل الملف باستخدام FileUpload:
يتطلب استيراد حزم الطرف الثالث:
يقوم ملف Apache-FilePload.jar بتحميل الحزمة الأساسية.
Apache-commons-io.jar هذه الحزمة عبارة عن حزمة تبعية لـ FileUpload. إنها أيضًا مجموعة أدوات.
الفئة الأساسية:
DiskfileItemFactory يعين مساحة القرص ويحفظ الملفات المؤقتة. مجرد فصل.
ServletFileUpload - الفئة الأساسية لتحميل الملفات ، والتي تتلقى الطلبات وتوصيف reqeust.
servletfileupload.parserequest (requdest) - List <IbourItem>
ملاحظة: FileItem هي بداية الشعار: -------- 243243242342 إلى -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
الخطوة 1: استيراد الحزمة:
الخطوة 2: اكتب servlet لإكمال طريقة Dopost
/*** معلمتان تم إنشاؤهما بواسطة DiskfileItemFactory* المعلمة الأولى: sizethReadhold - يحدد عدد بايت البيانات التي يجب حفظها في ذاكرة التخزين المؤقت (الذاكرة) ، الافتراضي هو 10K* إذا لم يكن الملف أكبر من 10K ، يمكنك فقط استخدام الذاكرة لإنقاذها مباشرة في ملف. * إذا كان الملف أكبر من 10K ، فأنت بحاجة إلى حفظ الملف في دليل مؤقت أولاً. * يشير ملف المعلمة الثاني إلى موقع الدليل المؤقت * */الفئة العامة up2servlet يمتد httpservlet {public void dopost (httpservletrequest req ، httpservletponse resp) servlexception ، ioException {req.setcharacterencoding ("utf-8") ؛ // احصل على مسار مسار سلسلة المشروع = getServletContext (). getRealPath ("/up") ؛ // تعلن الخطوة الأولى عن فئة مصنع DiskfileItemFactory ، والتي تُستخدم لوضع دليل مؤقت على القرص ، DiskfileItemFactory Disk = DiskfileItemFactory (1024*10 ، ملف جديد ("/Home/Wang/") ؛ // الخطوة الثانية: إعلان servletfileupoload واستقبل الدليل المؤقت أعلاه servletfileupload up = new servletfileupload (disk) ؛ . // إذا كان ملف ملف واحد فقط = list.get (0) ؛ // احصل على اسم الملف مع اسم Filename = file.getName () ؛ filename = filename.substring (filename.lastindexof ("//")+1) ؛ // احصل على نوع الملف سلسلة fileType = file.getContentType () ؛ // الحصول على ملف bytecode inputStream في = file.getInputStream () ؛ // إعلان الإخراج بايت دفق OutputStream Out = fileOutputStream جديد (path+"/"+filename) ؛ // file copy byte [] b = new byte [1024] ؛ int len = 0 ؛ بينما ((len = in.read (b))! =-1) {out.write (b ، 0 ، len) ؛ } out.close () ؛ حجم طويل = file.getInputStream (). متاح () ؛ // حذف ملف الملف المؤقت الذي تم تحميله. delete () ؛ // إظهار البيانات resp.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter op = resp.getWriter () ؛ op.print ("تم تحميل الملف بنجاح <br/> اسم الملف:"+filename) ؛ op.print ("<br/> نوع الملف:"+fileType) ؛ op.print ("<br/> حجم الملف (بايت)"+حجم) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}5. استخدم هذا الإطار لتحميل ملفات متعددة:
الخطوة 1: تعديل نموذج الصفحة إلى أنواع الإدخال المتعددة = "ملف"
<form action = "<c: url value = '/up3servlet' //>" method = "post" enctype = "multipart/form-data"> file1: <input type = "file" name = "txt"> <br/> file2: <input type = "file" name = "txt"
الخطوة 2: قائمة اجتياز
يمتد الفئة العامة UP3Servlet httpservlet {public void dopost (طلب httpservletrequest ، استجابة httpservletresponse) servletexception ، ioException {request.setcharacterencoding ("utf-8") ؛ string path = getServletContext (). getRealPath ("/up") ؛ // إعلان القرص diskfileitemfactory disk = diskfileItemFactory () ؛ Disk.SetSizethReshold (1024*1024) ؛ disk.setRepository (ملف جديد ("d:/a")) ؛ // إعلان servlet الذي يوسع طلب servletfileupload up = new servletfileupload (disk) ؛ حاول {// حل قائمة الطلبات <IpileItem> list = up.parserequest (request) ؛ // إعلان قائمة <map> تغليف بيانات قائمة الملفات التي تم تحميلها <map <string ، string >> ups = new ArrayList <map <string ، string >> () ؛ لـ (ملف fileItem: قائمة) {map <string ، string> mm = new HashMap <string ، string> () ؛ // احصل على اسم ملف اسم الملف = file.getName () ؛ filename = filename.substring (filename.lastindexof ("//")+1) ؛ String fileType = file.getContentType () ؛ inputStream in = file.getInputStream () ؛ int size = in.available () ؛ // استخدم فئة الأدوات fileutils.copyinputStreamTofile (في ، ملف جديد (path+"/"+filename)) ؛ Mm.put ("اسم الملف" ، اسم الملف) ؛ Mm.put ("filetype" ، filetype) ؛ mm.put ("size" ، "+size) ؛ ups.add (mm) ؛ file.delete () ؛} request.setattribute (" ups "، ups) ؛ // forward request.getRequestDispatcher ("/jsps/show.jsp ").ما سبق هو الطريقة الشائعة لتحميل الملفات. الآن دعونا نلقي نظرة على واجهات برمجة تطبيقات البحث الأخرى من FileUpload.
حدد ما إذا كان ملف fileItem هو ملف (type = file) أو نص (type = text | checkbox | radio) كائن:
Boolean iSformfield () إذا كان نصًا | مربع الاختيار | راديو | حدد ، القيمة صحيحة.
6. معالجة الصور مع معلومات الوصف
يمتد فئة updescservlet العامة httpservlet {public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {request.setcharencoding ("utf-8") ؛ DiskfileItemFactory Disk = new DiskfileItemFactory () ؛ disk.setRepository (ملف جديد ("d:/a")) ؛ حاول {servletfileUpload up = new ServleTfileUpload (disk) ؛ قائمة <Ibuitem> list = up.parserequest (request) ؛ لـ (ملف fileItem: قائمة) {// الخطوة 1: تحديد ما إذا كان عنصر نموذج عادي إذا كان (file.isformfield ()) {string filename = file.getfieldname () ؛ // <input type = "text" name = "desc"> = desc string value = file.getString ("" utf-8 ") ؛ // System.err.println (filename+"="+value) ؛ } آخر {// يشير إلى أنه اسم ملف سلسلة ملف = file.getName () ؛ filename = filename.substring (filename.lastindexof ("//")+1) ؛ file.write (ملف جديد (مسار+"/"+اسم الملف)) ؛ System.err.println ("اسم الملف هو:"+اسم الملف) ؛ System.err.println ("حجم الملف هو:"+file.getSize ()) ؛ file.delete () ؛ }}} catch (استثناء e) {E.PrintStackTrace () ؛ }}} 7. تحسين أداء تحميل الملفات
عند تحليل الطلب للحصول على مجموعة FileItem ، استخدم:
fileItemIterator it = up.getItemIterator (request) ؛
بالمقارنة مع الاستخدام
قائمة <Ibuitem> list = up.parserequest (request) ؛
أداء أفضل بكثير.
نموذج الرمز:
يمتد FastServlet الفئة العامة httpservlet {public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {request.setcharacterencoding ("utf-8") ؛ string path = getServletContext (). getRealPath ("/up") ؛ DiskfileItemFactory Disk = new DiskfileItemFactory () ؛ disk.setRepository (ملف جديد ("d:/a")) ؛ حاول {servletfileUpload up = new ServleTfileUpload (disk) ؛ . بينما (it.hasnext ()) {fileItemStream item = it.next () ؛ اسم ملف السلسلة = item.getName () ؛ filename = filename.substring (filename.lastindexof ("//")+1) ؛ inputStream in = item.OpenStream () ؛ fileUtils.copyInputStreamTofile (في ، ملف جديد (path+"/"+filename)) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }}} 8. تنزيل الملف
يمكن أن يكون إما الحصول أو النشر.
void dopost العامة (httpservletrequest req ، httpservletresponse resp) يلقي servletexception ، ioException {req.setcharacterencoding ("utf-8") ؛ اسم السلسلة = req.getParameter ("الاسم") ؛ // الخطوة 1: اضبط نوع الاستجابة resp.setContentType ("Application/Force-Download") ؛ // مسار سلسلة ملفات القراءة الثانية = getServletContext (). getRealPath ("/up/"+name) ؛ inputStream في = new FileInputStream (path) ؛ // قم بتعيين رأس الاستجابة // USERT URL ترميز اسم الملف اسم = urlencoder.encode (الاسم ، "UTF-8") ؛ Resp.Setheader ("Disposition" ، "المرفق ؛ filename ="+name) ؛ Resp.SetContEntLength (in.available ()) ؛ // الخطوة 3: ابدأ نسخ الملف OutputStream Out = resp.getOutputStream () ؛ بايت [] ب = بايت جديد [1024] ؛ int len = 0 ؛ بينما ((len = in.read (b))! =-1) {out.write (b ، 0 ، len) ؛ } out.close () ؛ in.close () ؛ } عند استخدام إطار J2EE الشعبيمن الأسهل استخدام التغليف الداخلي للإطار لإكمال التحميل والتنزيل:
يتم تحميل Struts2.
عند استخدام Struts2 للتنمية ، ليس من الصعب العثور على أن حزمة المشاع--1.3.1.jar موجودة في حزمة الجرة المستوردة. من خلال التعلم أعلاه ، يمكننا بالفعل استخدامه لتحميل الملفات وتنزيلها. لكن Struts2 يخضع لمزيد من التغليف.
منظر
<form action = "fileupload.action" method = "post" enctype = "multipart/form-data"> username: <input type = "text"
وحدة تحكم
الطبقة العامة fileUploAdActaction يمتد الإجراءات Upport {private string username ؛ // لاحظ أن الملف لا يشير إلى الملف نفسه الذي تم تحميله بواسطة JSP الواجهة الأمامية ، ولكن الملف الذي تم تحميله لتخزين ملف ملف الملف الخاص تحت المجلد المؤقت ؛ // سوف يعترض اسم الملف المقدم // الدعامات تلقائيًا اسم الملف الأخير ويحققه في هذا filefilename الخاص بالسلسلة الخاصة ؛ // يتم حفظ getter و setter في هذا الوقت لتوفير SPACE Override Public String Execute () يلقي استثناء {// حفظ المسار لتحميل سلسلة الملفات root = servleTactionContext.getServletContext (). getRealPath ("/upload") ؛ // احصل على تدفق إدخال الملف المؤقت INPUTSTREAM هو = جديد fileInputStream (ملف) ؛ // إخراج ملف OutputStream OS = جديد fileOutputStream (ملف جديد (الجذر ، FileFilename)) ؛ // اطبع اسم ملف file system.out.println ("fileFiLename:" + fileFilename) ؛ // لأن الملف هو ملف مخزّن في مجلد مؤقت ، يمكننا طباعة اسم الملف ومسار الملف الخاص به لمعرفة ما إذا كان هو نفسه ملف filefilename system.out.println ("الملف:" + file.getName ()) ؛ System.out.println ("file:" + file.getPath ()) ؛ Byte [] Buffer = New Byte [1024] ؛ طول int = 0 ؛ بينما (-1! = (طول = IS.Read (Buffer ، 0 ، buffer.length)))) {os.write (buffer) ؛ } os.close () ؛ is.close () ؛ العودة النجاح }}بادئ ذي بدء ، يجب أن نكون واضحين أن الملف هنا لا يشير حقًا إلى الملف الذي تم تحميله بواسطة JSP. عند تحميل الملف ، سيبحث Struts2 أولاً عن موقع التخزين المحدد بواسطة Struts.multipart.savedir (هذا في افتراضي. properties) (الافتراضي فارغ). يمكننا تحديد موقع التخزين المؤقت هذا في Struts2 لمشروعنا.
<name constant = "struts.multipart.savedir" value = "/ropository"/>
إذا لم يتم تعيين struts.multipart.savedir ، فسيتم استخدام العنوان المحدد بواسطة javax.servlet.context.tempdir افتراضيًا. يتم تحديد قيمة javax.servlet.context.tempdir بواسطة الخادم. على سبيل المثال: إذا كان سياق مشروع الويب الخاص بي هو ABC ويستخدم الخادم tomcat ، فيجب أن يكون SavePath ٪ Tomcat_home ٪/Work/Catalina/LocalHost/ABC_. يشبه اسم الملف المؤقت تحميل __1a156008_1373a8615dd__8000_00000001.tmp. قد يكون اسم الملف المؤقت مختلفًا في كل مرة ، لكنه في هذا النمط تقريبًا. وإذا كنت تستخدم خوادم في Eclipse لتكوين tomcat والبدء ، فلن يكون ٪ tomcat_home ٪ في العنوان أعلاه هو دليل جذر tomcat الفعلي في النظام ، ولكن سيكون العنوان المحدد بواسطة Eclipse. على سبيل المثال ، فإن عنواني المحلي هو كما يلي: /HOME/wang/eclipsejavacode/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/work/catalina/localhost/abc/upload__1a156008_1373a8615dd_000000000000000000000000000000000000000000000000000000.
تم الانتهاء من STRUTS2 من التنزيل.
قم بتنزيل ملف Struts2 أكثر بكل بساطة ، فقط حدد دفق الإدخال واكتب الملف في دفق الإدخال. لا يزال تكوين المفتاح هو تكوينه في ملف تكوين struts.xml:
يمتد الفئة العامة FileDownloadAction ActionSupport {// المسار لتنزيل الملف على مسار السلسلة الخاصة الخادم ؛ // اسم الملف للملف لتنزيل السلسلة الخاصة downloadFilename ؛ // اكتب getter و setter public inputStream getDownloadFile () {return servletactionContext.getServletContext (). getResourCeasStream (path) ؛ } Override Public String Execute () يلقي الاستثناء {// الإجراء الحالي هو setDownloadFilename (xxx) ؛ العودة النجاح }}يحدد الإجراء فقط عملية تنزيل دفق الإدخال ثم يوفر له طريقة getter. بعد ذلك ، لنلقي نظرة على ملف التكوين لـ Struts.xml:
<action name = "filedownload"> <result name = "download" type = "dream"> <param name = "contentDisposition"> filename = "$ {downloadFilename}" </param> <param name = "inputName"> downloadFile </param> </sult> </action>هناك العديد من الأماكن التي نحتاج فيها إلى الانتباه إلى ملف تكوين Struts.xml. أولاً ، يجب تعريف النوع على أنه دفق type_ ، إجراء الإجراء هذا هو نتيجة تنزيل الملف. عنصر النتيجة بشكل عام لديه عنصر فرعي بارام. يتم استخدام هذا لتعيين المعلمات عند تنزيل الملف. سمة inputName هي الحصول على دفق إدخال الملف في الإجراء. يجب أن يكون الاسم هو نفسه سمة دفق الإدخال في الإجراء. ثم سمة contentDisposition. تُستخدم هذه السمة بشكل عام لتحديد كيف نريد معالجة الملف الذي تم تنزيله. إذا كانت القيمة مرفقًا ، فسيظهر مربع التنزيل ، مما يسمح للمستخدم باختيار ما إذا كان سيتم التنزيل. إذا لم يتم تعيين هذه القيمة ، فسيقوم المتصفح أولاً بالتحقق مما إذا كان سيتم فتح الملف الذي تم تنزيله. إذا كان بإمكانه ذلك ، فسوف يفتح الملف الذي تم تنزيله مباشرة (بالطبع ليس ما نحتاجه). قيمة أخرى هي اسم الملف ، وهو اسم تنزيل الملف الذي يُطلب منه الملف عند التنزيل. بعد تكوين هذه المعلومات ، يمكننا تنفيذ وظيفة تنزيل الملف.
SPRINGMVC يكمل التحميل:
العرض هو بالضبط نفس مثال Struts2. هذا غير مكتوب.
وحدة التحكم:
@controller@requestMapping (value = "fileOperate") class public fileOperateAction {@requestmapping (value = "upload") string public upload (httpservletrequest request ،@requestParam ("file") multipartfile photofile) {// the the path file save request.getsession (). // اسم ملف الأسماء الأصلي للملف = photofile.getoriginalfilename () ؛ // احصل على سلسلة تمديد الملف extName = filename.substring (filename.lastindexof (".")) ؛ // منع تعارض اسم الملف ، قم بتعديل اسم fileName = filename.substring (0 ، filename.lastindexof (".")) + system.nanotime () + extName ؛ fileUtils.writeByTearRayTofile (ملف جديد (dir ، filename) ، photofile.getBytes ()) ؛ إرجاع "النجاح" ؛ }}springmvc تنزيل كامل:
requestmapping ("/download") تنزيل السلسلة العامة (اسم ملف السلسلة ، طلب httpservletrequest ، httpservletresponse استجابة) {response.setcharacterencoding ("UTF-8") ؛ استجابة. استجابة. جرب {inputStream inputStream = جديد fileInputStream (ملف جديد (مسار الملف) ؛ OutputStream OS = response.getOutputStream () ؛ byte [] b = new byte [2048] ؛ طول int ؛ بينما (length = inputStream.Read (b))> 0) } Catch (ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.