المتطلبات: قم بتنفيذ صفحة ويب مع وظيفة تنزيل الملف ، وتنزيل الحزم والصور المضغوطة بشكل أساسي:
1: تنزيل من خلال الارتباط التشعبي
في صفحة HTML ، رابط إلى عنوان الملف المراد تنزيله عبر الارتباط التشعبي
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> إدراج العنوان هنا </title> </head> <body> <h1> تنزيل ملف من خلال الرابط </h1> <a href = "/day06/download/cors.zip </body> </html>
عندما يكون Day06/Download هو مسار المستند ، فإن بنية البرنامج لهذا المثال هي كما يلي:
بعد تشغيل البرنامج ، يمكنك تنزيله بالنقر فوق المستند الذي تحتاجه إلى تنزيله.
ولكن ستظهر مشكلة هنا ، أي عند النقر لتنزيل الحزمة المضغوطة ، ستظهر صفحة التنزيل ، ولكن عند تنزيل الصورة ، سيفتح المتصفح الصورة مباشرة ولا يوجد تنزيل.
هذا لأنه عند تنزيل ملف من خلال الارتباط التشعبي ، إذا كان المتصفح يمكنه التعرف على تنسيق الملف ، فسيتم فتح المتصفح مباشرة. سيتم تحقيق التنزيل فقط إذا لم يتمكن المتصفح من التعرف على تنسيق الملف. لذلك ، يتم استخدام الطريقة الثانية لتحقيق وظيفة التنزيل.
2: تنفيذ التنزيل من خلال برنامج Servlet
يتمثل مبدأ تنزيل الملفات من خلال Servlet في قراءة البرنامج الهدف من خلال Servlet وإعادة الموارد إلى العميل.
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> إدراج العنوان هنا </title> </head> <body> <h1> تنزيل ملف من خلال الرابط </h1> <a href = "/day06/download/cors.zip <H1> تنزيل الملف من خلال برنامج Servlet </h1> <a href = "/day06/servletdownload؟ filename = cors.zip"> حزمة الضغط </a> <a href = "/day06/servletdownload؟
WHERE /DAY06 /SERVELTDownload هو مسار رسم الخرائط لبرنامج SERVELT ، ثم قم بإنشاء SERVELT جديد ، و ServletDownload ، ويتم تعيين عنوان URL إلى /servletDownload.
أضف الرمز على النحو التالي:
حزمة com.lsgjzhuwei.servlet.response ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputStream ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.annotation.webservlet ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ /** * servlet فئة تنفيذ servletdownload * /webservlet (asyncsupported = true ، urlpatterns = {"/servletdownload"}) servleddownload يمتد httpservlet {private static static final long serialversionuid = 1l ؛ / ** * seee httpservlet#httpservlet () */ public servleddownload () {super () ؛ // TODO TODALED AUTO CONTRUCTOR Stub}/** * see httpservlet#doget (طلب httpservletrequest ، استجابة httpservletresponse) */void void المحمية (httpletRequest request ، request strument structextip filename = request.getParameter ("filename") ؛ system.out.println (اسم الملف) ؛ // قم بتعيين ملف mime type response.setContentType (getServletContext (). getMimetype (filename)) ؛ // قم بتعيين استجابة تحديد المحتوى. // اقرأ الملف الهدف واكتب الملف الهدف إلى العميل من خلال استجابة // احصل على المسار المطلق لسلسلة الملف الهدف FullFilename = getServletContext (). getRealPath ("/تنزيل/" + اسم ملف) ؛ //system.out.println(fullfilename) ؛ // قراءة ملف inputStream في = new FileInputStream (fullfilename) ؛ outputStream Out = response.getOutputStream () ؛ // كتابة ملف int b ؛ بينما ((b = in.read ())! = -1) {out.write (b) ؛ } in.close () ؛ out.close () ؛ } / ** * see @see httpservlet#dopost (طلب httpservletrequest ، استجابة httpservletresponse) * / / void void dopost (طلب httpservletrequest ، استجابة httpservletresponse) servletexception ، ioexception أعد تشغيل خادم Tomcat لتحقيق تنزيل الحزم والصور المضغوطة.
ثلاثة. نصائح:
طريقة تنزيل الملفات بسيطة للغاية للنقر على الرابط. تقوم الخلفية بإخراج دفق الملف وتدرك وظيفة التنزيل من خلال المتصفح ، بما في ذلك الاستفسار حول الموقع وتخزين الملفات. ستقوم معظم المتصفحات بتكوين موقع ثابت ، وقد لا تسأل في كل مرة.
الواجهة الأمامية بسيطة للغاية ، مع علامة <a> ، HREF = "عنوان طريقة الخلفية". إذا كان لا يمكن استخدام احتياجاتك مباشرة في وضع الارتباط التشعبي ، فيمكنك كتابة window.location.href = "عنوان طريقة الخلفية" في JS.
بعد القفز إلى طريقة الخلفية
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 ، فسيعمل هذا.