تشترك الأمثلة الواردة في هذه المقالة في رمز تنزيل Java Breakpoints للرجوع إليه. المحتوى المحدد كما يلي
1. كود جافا
// تنفيذ ملف downloadFile () {file dir = new file (filePath) ؛ // الحصول على مسار الملف if (! dir.exists ()) {system.out.println ("خطأ مسار الملف") ؛ log.debug ("خطأ مسار الملف") ؛ إرجاع "فشل" ؛ // الاتجاه سواء كان ملف أو مجلد موجود} تنزيل ملف = ملف جديد (dir ، filename) ؛ // ابحث عن ملف if (! dir.isfile ())) {system.out.println ("الملف غير موجود") ؛ log.debug ("الملف غير موجود") ؛ إرجاع "فشل" ؛ // تحديد ما إذا كان الملف أو المجلد موجودًا} حاول {downloadFileranges (downloadFile) ؛ } catch (clientabortexception e) {system.out.println ("connection inited") ؛ log.debug ("connection inisted") ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } إرجاع فارغ ؛ } private void downloadFileranges (file downloadFile) rems ioexception {// size file size to to to to to to long long fileLength = downloadFile.Length () ؛ // حجم الملف تم تنزيله الطويل الطويل = 0 ؛ // ما إذا كنت تريد تنزيل القطار السريع ، وإلا فهو الرعد أو غيره من isflashget منطقية = صحيح ؛ // تستخدم لتسجيل عدد بايتات النهاية التي يجب تنزيلها (الرعد أو التنزيلات الأخرى) Long Lenend = 0 ؛ // تستخدم لتسجيل سلسلة نطاق البيانات المطلوبة من قبل العميل لتنزيل سلسلة RangeBytes = request.getheader ("المدى") ؛ // تستخدم لقراءة وكتابة ملفات عشوائية RandomAccessFile raf = null ؛ OutputStream OS = NULL ؛ OutputStream Output = null ؛ Byte B [] = New Byte [1024] ؛ // إذا كان طلب تنزيل العميل يحتوي على النطاق if (null! = rangebytes) {// code 206 reponse.setstatus (httpservletresponse.sc_partial_content) ؛ RangeByTes = request.getheader ("Range"). replaceall ("bytes =" ، "") ؛ // وضع سلسلة سلسلة القاضي if (rangebytes.indexof (' -') == rangebytes.length () - 1) {// لا يوجد رقم بايت نهائي ، isflashget السريع = true ؛ RangeBytes = RangeBytes.SubString (0 ، RangeBytes.indexof ('-')) ؛ pastLength = long.parselong (rangeBytes.trim ()) ؛ } آخر {// thunder download isflashget = false ؛ String StartBytes = RangeBytes.SubString (0 ، RangeBytes.indexof ('-')) ؛ string endbytes = rangebytes.substring (rangebytes.indexof ('-') + 1 ، rangebytes.length ()) ؛ // تنزيل جزء الملف pastLength = long.parselong (StartBytes.trim ()) ؛ . }} // أخطر العميل بالسماح بنقل نقاط التوقف بشكل مستمر ، فإن تنسيق الاستجابة هو: قبول النطاقات: bytes response.setheader ("قبول RANGES" ، "Bytes") ؛ // response.Reset () ؛ // إذا كان هذا هو التنزيل الأول ، فإن الحالة الافتراضية إلى 200 ، وتنسيق الاستجابة هو: http/1.1 200 ok if (0! = pastLength) {// content range string contentRange = "" ؛ // تنسيق الاستجابة //- المدى المحتوى: بايت [بدء بايت من كتلة الملف]-[إجمالي حجم الملف -1] || [حجم الملف الإجمالي] إذا (ISflashget) {contentRange = new StringBuffer ("bytes") .append (New Long (pastLength) .toString ()). . } آخر {contentRange = new StringBuffer (RangeBytes) .Append ("/") .Append (new Long (filelength) .ToString ()). toString () ؛ } response.setheader ("المدى المحتوى" ، contentRange) ؛ } string filename = getDownloadChineseFilename (اسم الملف) ؛ استجابة. // تنسيق الاستجابة هو: response.setContentType ("Application/Octet-tream") ؛ Response.addHeader ("طول المحتوى" ، string.valueof (طول fileLy)) ؛ حاول {os = response.getOutputStream () ؛ الإخراج = جديد bufferedoutputstream (OS) ؛ raf = new RandomAccessFile (downloadFile ، "r") ؛ // تخطي تنزيل bytes raf.seek (pastLength) ؛ if (isFlashget) {// express etc int n = 0 ؛ بينما ((n = raf.read (b ، 0 ، 1024))! = -1) {output.write (b ، 0 ، n) ؛ }} آخر {// thunder etc بينما (raf.getFilePointer () <lenend) {output.write (raf.read ()) ؛ }} output.flush () ؛ } catch (ioException e) { /*** عند كتابة البيانات ، يتم إلقاء استثناءات مثل clientabortexception* لأن العميل يلغي التنزيل ويستمر الخادم في كتابة البيانات إلى المتصفح. هذا طبيعي. خاصة بالنسبة لبرامج العميل المصممة للدم مثل الرعد. * من الواضح أن هناك بايت قراءة مؤشر ترابط = 1275856879-1275877358. * إذا لم تكتمل القراءة في فترة زمنية قصيرة ، فسيبدأ الرعد في الثانية والثالثة مرة أخرى. . . يقرأ الخيط نفس مقطع البايت حتى ينتهي مؤشر ترابط واحد من القراءة. سوف يقتل Thunder * مؤشرات الترابط الأخرى التي تقوم بتنزيل نفس مقطع البايت ، مما يؤدي إلى إحباط قراءة البايت بالقوة ، مما تسبب في رمي الخادم ClientabortException. * لذلك ، نتجاهل هذا الاستثناء*/} أخيرًا {if (الإخراج! = null) {output.close () ؛ } if (raf! = null) {raf.close () ؛ }}} سلسلة خاصة getDownloadChineseFilename (سلسلة paramname) {String downloadChineseFiLename = "" ؛ Try {downloadChineseFiLename = new String (paramname.getBytes ("GBK") ، "ISO8859-1") ؛ } catch (UnsupportedEncodingException e) {E.PrintStackTrace () ؛ } إرجاع DownloadChineseFilename ؛ } السلسلة العامة getFilePath () {return filepath ؛ } public void setFilePath (String filepath) {this.filePath = filePath ؛ } السلسلة العامة getFilename () {return filename ؛ } public void setFilename (اسم ملف السلسلة) {this.filename = filename ؛ } httpservletRequest getRequest () {refert request ؛ } httpservletresponse getResponse () {return response ؛ } 2. قسم الدعامات <br /> انسخ الرمز كما يلي: <action name = "downloadFile" method = "downloadFile">
<result name = "فشل" type = "redirectaction"> showdownloadfilenamelist </result>
</action>
3. جزء JSP
نسخة الكود كما يلي: <td> <a href = "downloadFile؟ filename = $ {filemap.key} && filepath = $ {filemap.value}"> تنزيل الملف </a> </td>