การใช้วิธีนี้คุณสามารถบรรจุไฟล์ได้ทันทีโอนไฟล์เหล่านั้นในขณะที่บรรจุภัณฑ์โดยไม่ต้องใช้แคชใด ๆ ทำให้ผู้ใช้สามารถรอเป็นศูนย์!
การคัดลอกรหัสมีดังนี้:
-
-
* ซ็อกเก็ตไคลเอนต์ MySocket
* ไฟล์ @param โฟลเดอร์หรือไฟล์ที่จะบรรจุ
* @Param ชื่อไฟล์ชื่อไฟล์ของการดาวน์โหลดแบบแพคเกจ
* @throws ioexception
-
โมฆะส่วนตัวลง (ไฟล์ไฟล์, ชื่อไฟล์สตริง) พ่น IOException {
outputStream outputStream = mysocket.getOutputStream ();
StringBuffer SB = ใหม่ StringBuffer ("HTTP/1.1 200 OK/R/N");
sb.append ("เซิร์ฟเวอร์: java/1.1/r/n");
sb.append ("เนื้อหาประเภท: แอปพลิเคชัน/octet-stream; charset = utf-8/r/n");
//sb.append("user-agent: mozilla/4.0 (เข้ากันได้; msie6.0; windows nt 5.0)/r/n ");
sb.append ("เนื้อหา-การจัดสรร: ไฟล์แนบ; filename =" + ชื่อไฟล์
+ "/r/n");
sb.append ("การถ่ายโอนการเข้ารหัส: chunked/r/n");
sb.append ("การเชื่อมต่อ: Keep-alive/r/n/r/n");
outputStream.write (sb.toString (). getBytes ());
outputstream.flush ();
zipcompressor zipcompressor = ใหม่ zipcompressor (ใหม่ myoutputstream (ใหม่ (
outputstream));
zipcompressor.compress (ไฟล์);
System.out.println ("zip end");
System.out.println ("เขียน '0 // r // n // r // n'");
outputStream.write ("0/r/n/r/n" .getBytes ()); // transfer-encoding: chunked transmission end flag
outputstream.flush ();
outputstream.close ();
System.out.println ("ดาวน์โหลดหยุด");
พยายาม {
mysocket.close ();
} catch (throwable t) {
-
-
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ cn.liangjintang.webserver.zipfile;
นำเข้า Java.io.BufferedInputStream;
นำเข้า Java.io.File;
นำเข้า Java.io.FileInputStream;
นำเข้า Java.io.OutputStream;
นำเข้า java.lang.reflect.field;
นำเข้า java.util.zip.crc32;
นำเข้า Java.util.zip.CheckedOutputStream;
นำเข้า java.util.zip.zipentry;
นำเข้า java.util.zip.zipoutputStream;
คลาสสาธารณะ zipcompressor {
บัฟเฟอร์ int สุดท้ายคงที่ = 8192;
เอาท์พุทสตรีมส่วนตัวเอาท์พุทสตรีม;
Public Zipcompressor (MyOutputStream OutputStream) {
this.outputStream = outputStream;
-
บีบอัดโมฆะสาธารณะ (ไฟล์ไฟล์) {
if (! file.exists ())
โยน runtimeException ใหม่ (file.getabsolutepath () + "ไม่มีอยู่จริง!");
พยายาม {
CheckedOutputStream cos = new CheckedOutputStream (OutputStream,
ใหม่ crc32 ());
zipoutputStream out = new ZipOutputStream (cos);
String -basedir = "";
บีบอัด (ไฟล์, ออก, พื้นฐาน);
out.close (); // จะต้องปิดเพื่อให้ข้อมูลสิ้นสุดของ zip จะถูกเขียนมิฉะนั้นไฟล์ zip จะไม่สมบูรณ์
} catch (Exception e) {
โยน RuntimeException ใหม่ (E);
-
-
การบีบอัดโมฆะส่วนตัว (ไฟล์ไฟล์, zipoutputstream out, string basedir) {
// ตัดสินว่าเป็นไดเรกทอรีหรือไฟล์
if (file.isdirectory ()) {
System.out.println ("การบีบอัด:" + flextir + file.getName ());
this.compressDirectory (ไฟล์, out, basedir);
} อื่น {
System.out.println ("การบีบอัด:" + flextir + file.getName ());
this.compressFile (ไฟล์, ออก, basedir);
-
-
// บีบอัดไดเรกทอรี
Private Void CompressDirectory (ไฟล์ Dir, ZipOutputStream Out, String basedir) {
ถ้า (! dir.exists ())
กลับ;
ไฟล์ [] files = dir.listfiles ();
สำหรับ (int i = 0; i <files.length; i ++) {
/** การเรียกซ้ำ*/
บีบอัด (ไฟล์ [i], out, based + dir.getName () + "/");
-
-
// บีบอัดไฟล์
Private Void CompressFile (ไฟล์ไฟล์, ZipOutputStream OUT, String AcmitleidIR) {
if (! file.exists ()) {
กลับ;
-
พยายาม {
bufferedInputStream bis = ใหม่ bufferedInputStream (
ใหม่ FileInputStream (ไฟล์));
zipentry entry = new ZipEntry (basedir + file.getName ());
out.putnextentry (รายการ);
จำนวน int;
ข้อมูลไบต์ [] = ไบต์ใหม่ [บัฟเฟอร์];
ในขณะที่ ((count = bis.read (data, 0, buffer))! = -1) {
out.write (data, 0, count);
-
bis.close ();
} catch (Exception e) {
โยน RuntimeException ใหม่ (E);
-
-
-
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ cn.liangjintang.webserver.zipfile;
นำเข้า java.io.filterOutputStream;
นำเข้า java.io.ioException;
นำเข้า Java.io.OutputStream;
คลาสสาธารณะ MyOutputStream ขยาย FilterOutputStream {
Public MyOutputStream (OutputStream) {
super (ออก);
-
ไบต์สุดท้าย [] onebytes = "1/r/n" .getBytes ();
ไบต์สุดท้าย [] rnbytes = "/r/n" .getBytes ();
โมฆะสาธารณะเขียน (int b) โยน ioexception {
out.write (onebytes); // bytes 1+crlf
out.write (b); // data entity
out.write (rnbytes); // crlf
-
โมฆะสาธารณะเขียน (ไบต์ [] b) โยน ioexception {
out.write (integer.tohexstring (b.length) .getBytes ()); // bytes, hexadecimal
out.write (rnbytes); // crlf
out.write (b); // data entity
out.write (rnbytes); // crlf
-
โมฆะสาธารณะเขียน (ไบต์ [] b, int ปิด, int len) โยน ioexception {
out.write (integer.tohexstring (len - ปิด) .getBytes ()); // bytes, hexadecimal
out.write (rnbytes); // crlf
out.write (b, ปิด, len); // data entity
out.write (rnbytes); // crlf
-
-
* เขียนวิธีนี้ใหม่มิฉะนั้น outputstream จะถูกปิดและข้อมูลอื่น ๆ <br/>
* (ตัวอย่างเช่นการเข้ารหัสการถ่ายโอน: ธงปลายการส่งสัญญาณแบบ chunked) ไม่สามารถเขียนต่อไปได้อีกต่อไป
-
Public Void Close () พ่น IOException {
-
-