دعونا نلقي نظرة أولاً على أبسط مثال لتنزيل الملف:
انسخ رمز الكود كما يلي:
الحزمة com.yyz.response؛
import java.io.FileInputStream;
import java.io.IOException;
استيراد java.io.OutputStream؛
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// تنزيل الملف
الطبقة العامة ResponseDemo تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
String realpath = this.getServletContext().getRealPath("/download/1.gif");
String filename = realpath.substring(realpath.lastIndexOf("//")+1);
Response.setHeader("content-disposition", "attachment;filename="+filename);
// يستخدم الخادم هذا الرأس ليطلب من المتصفح فتح البيانات في وضع التنزيل
FileInputStream in = new FileInputStream(realpath);
إنت لين = 0;
بايت عازلة[]= بايت جديد[1024];
OutputStream out = Response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in. Close();
// ليست هناك حاجة للإغلاق. عندما يتم تدمير الاستجابة، سيقوم الخادم تلقائيًا بإغلاق الدفق المتعلق بالاستجابة.
}
doPost باطلة عامة (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
doGet(request,response);
}
}
وظيفة هذا الرمز هي تنزيل الصورة 1.png من الخادم. يتم عرض بنية الدليل على النحو التالي باستخدام مستكشف حزم MyEclipse:
لنجعل الأمر أكثر صعوبة قليلاً. الملف الذي نريد تنزيله هو ملف يحمل اسمًا صينيًا. نظرًا لأن الأشياء الموجودة في ملف الرأس في بروتوكول http يمكن أن تكون فقط أحرف ASCII، فإن الطريقة المذكورة أعلاه (قم بتغيير String realpath = this.getServletContext().getRealPath("/download/1.gif"); مباشرة إلى String realpath = this . getServletContext().getRealPath("/download/picture.gif");) احصل على الملف مباشرة،
ستكون هناك مشاكل في التعليمات البرمجية المشوهة. مرفق نتائج الاختبار:
لحل هذه المشكلة، استخدم طريقة التشفير لفئة URLEncoder:
انسخ رمز الكود كما يلي:
الحزمة com.yyz.response؛
import java.io.FileInputStream;
import java.io.IOException;
استيراد java.io.OutputStream؛
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// عند تنزيل الملفات الصينية، يجب أن تكون أسماء الملفات الصينية مشفرة بعنوان URL.
الطبقة العامة ResponseDemo تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
String realpath = this.getServletContext().getRealPath("/download/picture.gif");
String filename = realpath.substring(realpath.lastIndexOf("//")+1);
Response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
// تقوم هذه الوظيفة بتشفير السلسلة إلى عنوان URL
FileInputStream in = new FileInputStream(realpath);
إنت لين = 0;
بايت عازلة[]= بايت جديد[1024];
OutputStream out = Response.getOutputStream();
while((len = in.read(buffer))>0){
out.write(buffer, 0, len);
}
in. Close();
}
doPost باطلة عامة (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
doGet(request,response);
}
}
مرفق نتائج الاختبار:
بالإضافة إلى ذلك، هناك تفصيل صغير يجب على الجميع الانتباه إليه:
لا يمكن استخدام FileReader بدلاً من FileInputStream. سيتم فقدان البيانات عند استخدام FileReader والسبب هو أن FileReader عبارة عن دفق أحرف، ويتم تخزين البيانات مثل الصور وملفات الوسائط في شكل 01. عند القراءة باستخدام FileReader، ستحتاج إلى الرجوع إلى جدول الترميز لم يتم تحديد التشفير، ويتم استخدام التشفير الافتراضي للنظام الأساسي المقابل. على سبيل المثال، ستقوم أجهزة الكمبيوتر في الصين بفحص GB2312. عند قراءة رمز غير موجود في جدول التعليمات البرمجية GB2312، سيتم تشفير البيانات في "؟" "، ستصبح البيانات صينية و"؟ 'مزج. بعد إرسالها إلى العميل، تحقق من جدول الرموز مرة أخرى عند عرضه، واستبدل جميع الرموز "؟" بـ "؟"، وسيتم فقدان البيانات. فقط تذكر شيئًا واحدًا حول هذه التفاصيل: يمكن لتدفقات البايت التعامل مع أي نوع من البيانات، ويمكن لتدفقات الأحرف التعامل مع بيانات الأحرف فقط.