Using this method, you can package files instantly, transfer them while packaging, without using any cache, allowing users to wait zero!
The code copy is as follows:
/**
*
* mySocket Client Socket
* @param file The folder or file to be packaged
* @param fileName The file name of the packaged download
* @throws IOException
*/
private void down(File file, String fileName) throws IOException {
OutputStream outputStream = mySocket.getOutputStream();
StringBuffer sb = new StringBuffer("HTTP/1.1 200 OK/r/n");
sb.append("Server: java/1.1/r/n");
sb.append("Content-Type:application/octet-stream;charset=UTF-8/r/n");
//sb.append("User-Agent: Mozilla/4.0 (compatible;MSIE6.0;Windows NT 5.0)/r/n");
sb.append("Content-Disposition: attachment; filename=" + fileName
+ "/r/n");
sb.append("Transfer-Encoding: chunked/r/n");
sb.append("Connection: Keep-Alive/r/n/r/n");
outputStream.write(sb.toString().getBytes());
outputStream.flush();
ZipCompressor zipCompressor = new ZipCompressor(new MyOutputStream(
outputStream));
zipCompressor.compress(file);
System.out.println("zip end");
System.out.println("write '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("download stop");
try {
mySocket.close();
} catch (Throwable t) {
}
}
The code copy is as follows:
package cn.liangjintang.webserver.zipFile;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipCompressor {
static final int BUFFER = 8192;
private OutputStream outputStream;
public ZipCompressor(MyOutputStream outputStream) {
this.outputStream=outputStream;
}
public void compress(File file) {
if (!file.exists())
throw new RuntimeException(file.getAbsolutePath() + "Not exist!");
try {
CheckedOutputStream cos = new CheckedOutputStream(outputStream,
new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
String basedir = "";
compress(file, out, basedir);
out.close();//It must be closed so that the end information of zip will be written, otherwise the zip file will be incomplete. If you want to continue writing, you can rewrite the outputStream.close() method
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void compress(File file, ZipOutputStream out, String basedir) {
//Judge whether it is a directory or a file
if (file.isDirectory()) {
System.out.println("Compression:" + basedir + file.getName());
this.compressDirectory(file, out, basedir);
} else {
System.out.println("Compression:" + basedir + file.getName());
this.compressFile(file, out, basedir);
}
}
// Compress a directory
private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists())
return;
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
/** recursion*/
compress(files[i], out, basedir + dir.getName() + "/");
}
}
//Compress a file
private void compressFile(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) {
return;
}
try {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
The code copy is as follows:
package cn.liangjintang.webserver.zipFile;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class MyOutputStream extends FilterOutputStream {
public MyOutputStream(OutputStream out) {
super(out);
}
final byte[] oneBytes = "1/r/n".getBytes();
final byte[] rnBytes = "/r/n".getBytes();
public void write(int b) throws IOException {
out.write(oneBytes);//Bytes 1+CRLF
out.write(b);//Data entity
out.write(rnBytes);//CRLF
}
public void write(byte[] b) throws IOException {
out.write(Integer.toHexString(b.length).getBytes());//Bytes, hexadecimal
out.write(rnBytes);//CRLF
out.write(b);//Data entity
out.write(rnBytes);//CRLF
}
public void write(byte[] b, int off, int len) throws IOException {
out.write(Integer.toHexString(len - off).getBytes());//Bytes, hexadecimal
out.write(rnBytes);//CRLF
out.write(b, off, len);//Data entity
out.write(rnBytes);//CRLF
}
/**
* Rewrite this method, otherwise the OutputStream will be closed, and other data<br/>
* (For example, Transfer-Encoding: chunked transmission end flag) can no longer continue writing
*/
public void close() throws IOException {
}
}