تحميل الملفات شائع جدًا في تطبيقات الويب. من السهل جدًا تطبيق وظيفة تحميل الملفات في بيئة JSP ، لأن هناك العديد من مكونات تحميل الملفات التي تم تطويرها في Java على الإنترنت. تأخذ هذه المقالة مكون العموم fileupload كمثال لإضافة وظيفة تحميل الملف إلى تطبيقات JSP.
يعد مكون المشترك بين المشاريع المشتركة أحد المشاريع المصدر المفتوحة لـ Apache ويمكن تنزيله من http://jakarta.apache.org/commons/fileupload/.
يتيح لك هذا المكون تحميل ملف واحد أو أكثر في وقت واحد ويمكنه الحد من حجم الملف.
بعد التنزيل ، قم بفك ضغط حزمة Zip ونسخ المشاع--1.0.jar إلى WebApps من Tomcat ضمن WebAppWeb-Inflib. إذا كان الدليل غير موجود ، فيرجى إنشاء الدليل الخاص بك.
إنشاء servlet جديد: upload.java لتحميل الملف:
استيراد java.io.*؛ استيراد java.util.*؛ استيراد javax.servlet.*؛ استيراد javax.servlet.http.*؛ استيراد org.apache.commons.fileupload.*؛ يمتد تحميل الفئة العامة httpservlet {private string eploadpath = "c: upload" ؛ // دليل لتحميل الملفات الخاصة سلسلة temppath = "C: UploadTMP" ؛ // دليل الملفات المؤقتة الفراغ العام dopost (طلب httpservletrequest ، استجابة httpservletresponse) يلقي ioException ، servlexception {}}في طريقة dopost () ، عندما يتلقى servlet طلب البريد الصادر عن المتصفح ، فإنه يدرك تحميل الملف. هنا هو رمز العينة:
DOPOST public void (طلب httpservletrequest ، استجابة httpservletresponse) يلقي ioException ، servleTexception {try {diskfileupload fu = new diskfileupload () ؛ // قم بتعيين الحد الأقصى لحجم الملف ، وهنا 4MBFU.SetSizeSemax (4194304) ؛ // اضبط حجم المخزن المؤقت ، وهنا 4KBFU.SetSizeSethReshold (4096) ؛ // تعيين الدليل المؤقت: fu.setRepositoryPath (Temppath) ؛ // الحصول على جميع الملفات: قائمة fileItems = fu.parserequest (request) ؛ iterator i = fileitems.iterator () ؛ // معالجة كل ملف بالتسلسل: بينما (i.hasnext ()) {fileItem fi = (fileItem) i.next () ؛ // احصل على اسم الملف ، ويتضمن اسم الملف المسار: string filename = fi.getName () ؛ // هنا يمكنك تسجيل معلومات المستخدم والملف // ...// اكتب إلى الملف ، واسم الملف المعتاد هو a.txt ، ويمكن استخراج اسم الملف من اسم الملف: fi.write (ملف جديد (uploadpath + "a.txt")) ؛ }} catch (استثناء e) {// يمكنك القفز إلى صفحة الخطأ}}إذا كنت ترغب في قراءة مجلد التحميل المحدد في ملف التكوين ، فيمكنك تنفيذه بطريقة init ():
public void init () يلقي ServleTexception {eploadpath = .... temppath = .... // إذا لم يكن المجلد موجودًا ، فسيتم إنشاؤه تلقائيًا: if (! ملف جديد (eploadpath) .isdirectory ()) ملف جديد (uploadpath) .mkdirs () ؛ if (! ملف جديد (temppath) .isdirectory ()) ملف جديد (temppath) .mkdirs () ؛ }تجميع servlet ، كن حذرًا في تحديد ClassPath ، تأكد من تضمين المشاع-OPLOAD-1.0.JAR و TOMCATCOMMONLIBSERVLET-API.JAR.
قم بتكوين Servlet ، واستخدم Notepad لفتح tomcatwebapps ل webappweb-sweb.xml الخاص بك ، وإنشاء واحدة جديدة إن لم يكن.
التكوينات النموذجية هي كما يلي:
〈؟ xml الإصدار = "1.0" الترميز = "ISO-8859-1"؟〉! 2.3 // en "" http://java.sun.com/dtd/web-app_2_3.dtd "> 〈web-app> 〈servlet> 〈servlet-name> تحميل 〈/servlet-name> 〈servlet-class> upload 〈/s ervlet-class> 〈servlet-mapping 〈servlet-name> تحميل 〈/servlet-name> 〈url-pattern〉/fileupload 〈/url-pattern 〈/servlet mapping 〈/web-app 〈
بعد تكوين Servlet ، ابدأ Tomcat واكتب اختبار HTML بسيط:
〈Form Action = "fileUpload" method = "post" env "enctype =" multipart/form-data "name =" form1 "> 〈input type =" file "name =" file "> 〈type =" profft "
ملاحظة Action = "FileUpload" حيث يكون FileUpload هو نمط URL المحدد عند تكوين Servlet.
هنا هو رمز الروبيان:
هذا التحميل أسهل بكثير في الاستخدام من SmartUpload. تم إنشاؤه بالكامل من قبلي واحدًا تلو الآخر ، على عكس Smartupload الذي يحتوي على العديد من الأخطاء.
طريقة الاتصال:
تحميل up = جديد تحميل () ؛ up.init (طلب) ؛ /** يمكن استدعاء setSavedir (سلسلة SaveDir) ؛ قم بتعيين المسار و Call SetMaxFilesize (الحجم الطويل) لتعيين الحد الأقصى للبايت للملف المحمّل. استدعاء Call SettagFilename (سلسلة) لتعيين اسم الملف بعد التحميل (صالح فقط للملف الأول)*/UP. تحميل file () ؛
ثم string [] names = up.getFilename () ؛ احصل على اسم الملف الذي تم تحميله ، يجب أن يكون المسار المطلق للملف
الدليل المحفوظ SaveIr+"/"+أسماء [i] ؛
يمكنك الحصول على النص الذي تم تحميله أو UP.GetParamEtervalues ("FIDED") من خلال UP.GetParameter ("Field") ؛
احصل على قيم الحقول بنفس الاسم مثل مربعات الاختيار المتعددة.
جرب الآخرين بنفسك.
رمز المصدر كما يلي: ______________________________________________________________________
حزمة com.inmsg.beans ؛ استيراد java.io.*؛ استيراد java.util.*؛ استيراد javax.servlet.*؛ استيراد javax.servlet.http.*؛ تحميل الفئة العامة {private string saveir = "." ؛ // PATH لحفظ الملف الخاص بالسلسلة الخاصة contentType = "" ؛ // نوع المستند السلسلة الخاصة charset = "" ؛ // مجموعة شخصية ArrayList الخاصة tmpfilename = new ArrayList () ؛ // بنية البيانات المؤقتة لتخزين أسماء الملفات المعلمة الخاصة بـ hashtable = new hashtable () ؛ // بنية البيانات التي تخزن أسماء المعلمات ويقدر سياق servletContext الخاص ؛ // سياق البرنامج ، يستخدم لتهيئة طلب httpservletrequest الخاص ؛ // مثيل يستخدم لتمرير في طلب كائن السلسلة الخاصة = "" ؛ // بيانات بيانات الذاكرة الخاصة int len = 0 ؛ // طول البايت في الواقع من الداخل في كل مرة Querystring سلسلة خاصة ؛ عدد int الخاص // إجمالي عدد الملفات التي تم تحميلها سلسلة خاصة [] اسم الملف ؛ // تحميل اسم الملف صفيف خاص طويل maxfilesize = 1024 * 1024 * 10 ؛ // الحد الأقصى لعمود تحميل الملف ؛ سلسلة خاصة tagfilename = "" ؛ init public void init (طلب httpservletrequest) يلقي servletexception {this.request = request ؛ الحدود = request.getContentType (). substring (30) ؛ // احصل على بيانات DELIMITER QueryString = request.getquerystring () ؛ } السلسلة العامة getParameter (سلسلة S) {// تستخدم للحصول على قيمة المعلمة للحقل المحدد ، Override request.getParameter (سلسلة S) if (parameter.isempty ()) {return null ؛ } return (سلسلة) المعلمة. } السلسلة العامة [] getParamEtervalues (سلسلة S) {// تستخدم للحصول على صفيف المعلمة المحددة مع حقل الاسم نفسه ، verride request.getParametervalues (سلسلة S) ArrayList al = new ArrayList () ؛ if (parameter.isempty ()) {return null ؛ } التعداد e = parameter.keys () ؛ بينما (e.hasmoreElements ()) {string key = (string) e.NextElement () ؛ if (-1! = key.indexof (s + "|||||||||||") || key.equals (s)) {al.add (parameter.get (key)) ؛ }} if (al.size () == 0) {return null ؛ } string [] value = new string [al.size ()] ؛ لـ (int i = 0 ؛ i 〈value.length ؛ i ++) {value [i] = (string) al.get (i) ؛ } قيمة الإرجاع ؛ } السلسلة العامة getQuerystring () {return QueryString ؛ } public int getCount () {return count ؛ } السلسلة العامة [] getFilename () {return filename ؛ } public void setMaxFilesize (حجم طويل) {maxFilesize = size ؛ } public void settagfilename (اسم ملف السلسلة) {tagFilename = filename ؛ } public void setSavedir (سلسلة SaveDir) {// قم بتعيين المسار لحفظه لتحميل الملف this.savedir = saveDir ؛ ملف testDir = ملف جديد (SoveDir) ؛ // للتأكد من وجود الدليل ، إذا كان هناك لا ، قم بإنشاء الدليل إذا (! testDir.exists ()) {testDir.mkdir () ؛ }} public void setcharset (String charset) {// قم بتعيين حرف تعيين this.charset = charset ؛ } Public Boolean UploadFile () يلقي ServleTexception ، iOexception {// mode method the setharset (request.getCharacterEncoding ()) ؛ إرجاع uploadfile (request.getInputStream ()) ؛ } قم بتحميل Boolean الخاص (ServleTinputStream servletinputStream) يلقي // الطريقة الرئيسية للحصول على بيانات التخزين المركزية ServleTexception ، IoException {string line = null ؛ Byte [] Buffer = New Byte [256] ؛ بينما ((line = readline (buffer ، servletinputStream ، charset))! = null) {if (line.startswith ("content-disposition: form-data ؛"))) {int i = line.indexof ("filename =") ؛ إذا (i〉 = 0) {// إذا كان هناك اسم ملف = في الوصف في محدد ، فهذا يعني أنه المحتوى المشفر لسلسلة الملف fname = getFilename (السطر) ؛ if (fname.equals ("")) {متابعة ؛ } if (count == 0 && tagfilename.length ()! = 0) {String ext = fname.substring ((fname.lastindexof (".") + 1)) ؛ fname = tagfilename + "." + تحويلة ؛ } tmpfilename.add (fname) ؛ count ++ ؛ بينما ((line = readline (buffer ، servleTinputStream ، charset))! = null) {if (line.length () 〈= 2) {break ؛ }} file f = new file (SoveDir ، fname) ؛ fileOutputStream dos = new FileOutputStream (f) ؛ حجم طويل = 0L ؛ بينما ((line = readline (buffer ، servleTinputStream ، null))! = null) {if (line.indexof (الحدود)! = -1) {break ؛ } size += len ؛ if (size〉 maxfilesize) {رمي ioException جديد ("يتجاوز الملف" + maxfilesize + "byte!") ؛ } dos.write (buffer ، 0 ، len) ؛ } dos.close () ؛ } آخر {// وإلا هو محتوى سلسلة ترميز الحقل = getKey (السطر) ؛ قيمة السلسلة = "" ؛ بينما ((line = readline (buffer ، servleTinputStream ، charset))! = null) {if (line.length () 〈= 2) {break ؛ }} بينما ((line = readline (buffer ، servleTinputStream ، charset))! = null) {if (line.indexof (boundary)! = -1) {break ؛ } value += line ؛ } put (key ، value.trim () ، parameter) ؛ }}} if (QueryString! = null) {string [] every = split (QueryString ، "&") ؛ لـ (int k = 0 ؛ k 〈eary.length ؛ k ++) {string [] nv = split (كل [k] ، "=") ؛ if (nv.length == 2) {put (nv [0] ، nv [1] ، parameter) ؛ }}} filename = new string [tmpfilename.size ()] ؛ لـ (int k = 0 ؛ k 〈filename.length ؛ k ++) {filename [k] = (string) tmpfilename.get (k) ؛ // صب اسم الملف المؤقت في ArrayList في البيانات للمستخدم للاتصال} if (filename.length == 0) {return false ؛ // إذا كانت بيانات اسم الملف فارغة ، فهذا يعني أنه لا يتم تحميل ملف} إرجاع True ؛ } private void put (مفتاح السلسلة ، قيمة السلسلة ، htable ht) {if (! ht.containskey (key)) {ht.put (المفتاح ، القيمة) ؛ } آخر {// إذا كان لديك بالفعل مفتاح بنفس الاسم ، فيجب عليك إعادة تسمية المفتاح الحالي. في الوقت نفسه ، احرص على عدم تشكيل نفس اسم المفتاح المحاولة {thread.currentThread (). النوم (1) ؛ // من أجل عدم إنشاء مفتاحين متطابقين في نفس ms} catch (استثناء e) {} key += "||||||||||||" + system.currentTimeMillis () ؛ ht.put (المفتاح ، القيمة) ؛ }}/* call servletinputstream.readline (byte [] b ، int ، int ، length) ، الذي يقرأ سطرًا من دفق ServleTinputStream إلى صفيف البايت المحدد. من أجل التأكد من أنه يمكن أن يستوعب خطًا ، يجب ألا يقل البايت [] ب 256. في خط القراءة المعاد كتابته ، يتم استدعاء متغير الأعضاء إلى العدد الفعلي لقراءة البايتات (بعض الخطوط أقل من 256). عند كتابة محتوى الملف ، يجب كتابة بايت طول LEN من صفيف البايت بدلاً من طول البايت الكامل []. ومع ذلك ، فإن طريقة إعادة الكتابة تقوم بإرجاع السلسلة لتحليل المحتوى الفعلي ولا يمكن إرجاع LEN ، لذلك يتم تعيين LEN كمتغير عضو وتعيين الطول الفعلي له في كل مرة يتم فيها عملية القراءة. وهذا يعني ، عند معالجة محتوى الملف ، يجب إرجاع البيانات في شكل سلسلة لتحليل علامات البدء والنهاية ، وكذلك مكتوبة إلى دفق إخراج الملفات في شكل بايت [] في نفس الوقت. */private string readline (byte [] linybyte ، servletinputStream servletinputStream ، String charset) {try {len = servletinputStream.Readline (linybyte ، 0 ، linybyte.length) ؛ if (len == -1) {return null ؛ } if (charset == null) {return new string (linebyte ، 0 ، len) ؛ } آخر {return New String (Linebyte ، 0 ، Len ، Charset) ؛ }} catch (استثناء _ex) {return null ؛ }} سلسلة خاصة getFilename (خط السلسلة) {// افصل اسم الملف عن سلسلة الوصف if (line == null) {return "" ؛ } int i = line.indexof ("filename =") ؛ line = line.substring (i + 9) .trim () ؛ i = line.lastindexof ("") ؛ if (i 〈0 || i〉 = line.length () - 1) {i = line.lastindexof ("/") ؛ if (line.equals ("" "" ")) {return" "؛ } if (i 〈0 || i〉 = line.length () - 1) {return line ؛ }} line.substring (i + 1 ، line.length () - 1) ؛ } سلسلة private getKey (خط السلسلة) {// افصل اسم الحقل عن سلسلة الوصف if (line == null) {return "" ؛ } int i = line.indexof ("name =") ؛ line = line.subString (i + 5) .trim () ؛ إرجاع line.substring (1 ، line.length () - 1) ؛ } سلسلة ثابتة عامة [] split (String Strob ، mark string) {if (strob == null) {return null ؛ } StringTokenizer St = New StringTokenizer (Strob ، Mark) ؛ ArrayList TMP = new ArrayList () ؛ بينما (st.hasmoretokens ()) {tmp.add (st.nextToken ()) ؛ } string [] Strarr = new String [tmp.size ()] ؛ لـ (int i = 0 ؛ i 〈tmp.size () ؛ i ++) {strarr [i] = (string) tmp.get (i) ؛ } إرجاع سترار ؛ }} التنزيل بسيط للغاية. طالما قمت بمعالجته على النحو التالي ، فلن تحدث أي مشكلة. تنزيل public void (String filepath ، httpservletresponse ، isonline boolean) يلقي استثناء {file f = file new (filepath) ؛ إذا (! يعود؛ } bufferedInputStream BR = جديد BufferEdInputStream (FileInputStream جديد (F)) ؛ Byte [] buf = new byte [1024] ؛ int len = 0 ؛ استجابة. reset () ؛ // من المهم جدًا إذا (isonline) {// ononopen method url u = new url ("file: ///"+filepath) ؛ استجابة. استجابة. // يجب ترميز اسم الملف على أنه UTF-8} آخر {// Pure Download Method Response.setContentType ("Application/X-MsDownload") ؛ استجابة. } outputStream Out = response.getOutputStream () ؛ بينما ((len = br.read (buf))〉 0) out.write (buf ، 0 ، len) ؛ br.close () ؛ out.close () ؛ }