我做网络硬盘,但选择一个文件夹时点下载,就是要把文件夹里所有的文件都下载下来,怎么同时下载几个文件呢,网易网盘是先把文件打包,然后下载,可是怎么把几个文件打包呢

解决方案 »

  1.   

    JSP中将多个文件打包下载代码:
    <%@page import="java.util.*, 
    java.net.*, 
    java.text.*, 
    java.util.zip.*, 
    java.io.*" %> 
    <%! 
    static Vector expandFileList(String[] files, boolean inclDirs){ 
    Vector v = new Vector(); 
    if (files == null) return v; 
    for (int j=0; j < files.length; i++) v.add (new File(URLDecoder.decode(files[j]))); 
    for (int i=0; i < v.size(); i++){ 
    File f = (File) v.get(i); 
    if (f.isDirectory()){ 
    File[] fs = f.listFiles(); 
    for (int n = 0; n < fs.length; n++) v.add(fs[n]); 
    if (!inclDirs){ 
    v.remove(i); 
    i--; 



    return v; 
    } class Writer2Stream extends OutputStream{ 
    Writer out; 
    Writer2Stream (Writer w){ 
    super(); 
    out = w; 

    public void write(int i) throws IOException{ 
    out.write(i); 

    public void write(byte[] b) throws IOException{ 
    for (int j=0;j<b.length;j++){ 
    int n=b[j]; 
    //Convert byte to ubyte 
    n=((n>>>4)&0xF)*16+(n&0xF); 
    out.write (n); 


    public void write(byte[] b, int off, int len) throws IOException{ 
    for (int j = off; j < off + len; j++){ 
    int n=b[j]; 
    n = ((n>>>4)&0xF)*16+(n&0xF); 
    out.write(n); 


    }  
    %> 
    <% 
    /////下载压缩文件包 
    Vector v = expandFileList(request.getParameterValues("selfile"), false); 
    if (v.size() == 0){ 
    request.setAttribute("error", "No files selected"); 

    else{ 
    File dir_file = new File(request.getRealPath("") + "/myfile/"); 
    int dir_l = dir_file.getAbsolutePath().length(); 
    response.setContentType ("application/zip"); 
    response.setHeader ("Content-Disposition", "attachment;filename=\"downloadname.rar\""); 
    out.clearBuffer(); 
    ZipOutputStream zipout = new ZipOutputStream(new Writer2Stream(out)); 
    zipout.setComment("Download selected files \nas one WinRAR file:\ndownloadname.rar"); 
    zipout.setLevel(1); 
    for (int i=0;i<v.size();i++){ 
    File f = (File)v.get(i); 
    if (f.canRead()){ 
    zipout.putNextEntry(new ZipEntry(f.getAbsolutePath().substring(dir_l+1))); 
    BufferedInputStream fr = new BufferedInputStream(new FileInputStream(f)); 
    byte buffer[] = new byte[0xffff]; 
    int b; 
    while ((b=fr.read())!=-1) zipout.write(b); 
    fr.close(); 
    zipout.closeEntry(); 


    zipout.finish(); 
    out.flush(); 

    %>