الأفكار الأساسية:
كانت الفكرة السابقة هي ظهور مربع لتسأل المستخدم عن المكان الذي يريد تخزين الملف ، ثم قمت بإنشاء ملف آخر ووضعه هناك. ومع ذلك ، لم تنجح فكرتي.
طريقة تنزيل الملفات بسيطة للغاية للنقر على الرابط. تقوم الخلفية بإخراج دفق الملف وتدرك وظيفة التنزيل من خلال المتصفح ، بما في ذلك الاستفسار حول الموقع وتخزين الملفات. ستقوم معظم المتصفحات بتكوين موقع ثابت ، وقد لا تسأل في كل مرة.
الواجهة الأمامية بسيطة للغاية ، علامة <A> ، HREF = "عنوان طريقة الخلفية". إذا كان لا يمكن استخدام احتياجاتك مباشرة في الارتباط التشعبي ، فيمكنك كتابته في JS
window.location.href = "عنوان طريقة الخلفية".
بعد القفز إلى طريقة الخلفية
String filePath = this.getClass (). // مسار الملف في ملف Project Outfile = ملف جديد (FilePath) ؛ filename string = outfile.getName () ؛ // الحصول على اسم الملف inputStream fis = جديد bufferedInputStream (FileInputStream جديد (filePath)) ؛ byte [] buffer = new byte [fis.availival ()] ؛ Fis.Read (Buffer) ؛ // اقرأ دفق الملف fis.close () ؛ استجابة. reset () ؛ // إعادة تعيين مجموعة النتائج. // إرجاع اسم ملف الرأس review.addheader ("طول المحتوى" ، " + outfile.length ()) ؛ // إرجاع حجم ملف الرأس. // قم بتعيين نوع البيانات // احصل على إخراج الجسم الإرجاع الأيمن OutputStream OS = جديد BufferEdoutputStream (response.getOutputStream ()) ؛ OS.Write (المخزن المؤقت) ؛ // file file os.flush () ؛ OS.Close () ؛ سيتعرف المتصفح بشكل مباشر على هذا النموذج من إخراج الملفات وينبثق مربع الحوار.
لاحظ أنه يجب ضبط هذه الطريقة في الخلفية باستخدام طريقة الارتباط. لا يمكن استخدام أساليب AJAX و XMLHTTPREQUEST. وبهذه الطريقة ، سيتم إرجاع دفق الملف الذي تم إرجاعه إلى وظيفة رد الاتصال بالطريقة. بالطبع ، إذا كنت ترغب في الحصول على الملف في JS ، فسيعمل هذا.
مثال
حزمة cn.itcast.day06.web.servlet ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputstream ؛ استيراد java.net.urlencoder ؛ استيراد javax.servlet.servletcontext ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpletresponse ؛ يمتد تنزيلات الفئة العامة httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) رمي servletexception ، ioException {// تنفيذ وظيفة سلسلة مضادة للسرقة // الحصول على رأس المرجع لشرح أين يأتي الزائر من enterer required. if (enderer == null ||! reparer.startswith ("http: // localhost")) {// إنه thief thief review.sendRedirect ("/day06/index.jsp") ؛ يعود ؛ } // حل مشكلة استجابة الاستجابة الصينية المشوهة. . . // اقرأ بيانات الصورة وأرسلها إلى سلسلة IE Browser WebPath = "/Download/beauty.jpg" ؛ // ما يعادل مسار تطبيق الويب servletContext الحالي = super.getServletContext () ؛ inputStream in = servletContext.getResourCeasStream (WebPath) ؛ outputStream Out = response.getOutputStream () ؛ int len ؛ Byte [] Buffer = New Byte [1024] ؛ بينما ((len = in.read (buffer))! =-1) Out.write (buffer ، 0 ، len) ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}