当前位置: 澳门新濠3559 > 操作系统 > 正文

压缩时间%3$d,目前的情况是生成文件没有问题

时间:2019-12-21 19:57来源:操作系统
我的表单内有好几个文件上传控件,每个控件里有多个文件。在后台用了MultipartFile接受后我想把每个框的文件压缩成一个zip,并且直接生成base64位的zip字符串,因为我需要在webservice中

我的表单内有好几个文件上传控件,每个控件里有多个文件。在后台用了MultipartFile接受后我想把每个框的文件压缩成一个zip,并且直接生成base64位的zip字符串,因为我需要在webservice中传输,目前的情况是生成文件没有问题,但是在转base64位时好像会破坏这个压缩文件,导致解码后打不开。如果先生成一个文件,再通过文件流的形式转base64位是没有问题的。我想问下这个有办法解决吗?代码部分:/** 文件压缩zip*/publicstaticStringZipFiles(MultipartFile[]srcfile,HttpServletRequestrequest){byte[]buf=newbyte[1024];ZipOutputStreamout=null;StringcompressedStr=null;ByteArrayOutputStreambout=null;try{bout=newByteArrayOutputStream();out=newZipOutputStream(bout);for(inti=0;isrcfile.length;i++){System.out.print(srcfile[i].getOriginalFilename());InputStreamin=srcfile[i].getInputStream();System.out.print(in);out.putNextEntry(newZipEntry(srcfile[i].getOriginalFilename()));intlen;while((len=in.read(buf))0){out.write(buf,0,len);}in.close();out.closeEntry();}byte[]compressed=bout.toByteArray();compressedStr=encoder.encodeBuffer(compressed);out.close();bout.close();}catch(IOExceptione){e.printStackTrace();}finally{try{out.close();}catch(Exceptione){e.printStackTrace();}}returncompressedStr;}publicstaticvoiddecoderBase64File(Stringbase64Code)throwsException{byte[]buffer=newBASE64Decoder().decodeBuffer(base64Code);FileOutputStreamout=newFileOutputStream("d://copytest.zip");out.write(buffer);out.close();}这样生成的文件缺失报不可预料的压缩文件末端。。。。。如果先生成一个文件再用文件流的方式生成base64位是可以的,但是我不想中间有这么一步。。。或者大家有什么别的方式可以解决?

1.搬运这个代码的目的:不想看见网上的各种曲线救国,不存在什么获取文件数据流先写成文件再解压缩。

选中文件打zip包下载

package Demo;

2.This is A DEMO :

/**

* 根据客户端传过来的数据流直接生成文件,不需要写成文件再解压缩

*@paramdatas

*@paramtargetFileDir

*@throwsException

*/

public voidunZipByte(byte[] datas,String targetFileDir)throwsException {

        // System.setProperty("sun.zip.encoding",

        // System.getProperty("sun.jnu.encoding"));

        ByteArrayInputStream bis =newByteArrayInputStream(datas);

        ZipInputStream zis =newZipInputStream(bis);

        ZipEntry entry =null;

        while((entry = zis.getNextEntry()) !=null) {

                // System.out.printf("条目信息: 名称%1$b, 大小%2$d, 压缩时间%3$d n",

                // entry.getName(), entry.getSize(), entry.getTime());

                        if(entry.isDirectory()) {// is dir

                            // System.out.println(entry.getName() + "是一个目录");

                                File f =newFile(targetFileDir + File.separator+ entry.getName());

                                if(!f.exists())

                                            f.mkdirs();

                                    }else{//

                                    byte[] data = getByte(zis);// 获取当前条目的字节数组

                                    InputStream is =newByteArrayInputStream(data);// 把当前条目的字节数据转换       成Inputstream流

                                    String[] names = entry.getName().split("/");

                                String path = targetFileDir + File.separator;

                                    path +=join(names, File.separator);

                                            //System.out.println(path);

                                            File file =newFile(path);

                                            if(!file.exists()) {

                                            file.createNewFile();

                                            toWrite(is, file);

                                            }

                                }

                        }

            }

/**

* 向file文件写入字节

*@paramins

*@paramfile

*压缩时间%3$d,目前的情况是生成文件没有问题。/

public static voidtoWrite(InputStream ins, File file) {

try{

        OutputStream os =newFileOutputStream(file);

        intbytesRead =0;

        byte[] buffer =new byte[8192];

        while((bytesRead = ins.read(buffer,0,8192)) != -1) {

                os.write(buffer,0, bytesRead);

            }

            os.close();

            ins.close();

            }catch(Exception e) {

                e.printStackTrace();

                }

}

/**

* 获取条目byte[]字节

*@paramzis

*@return

*/

public byte[] getByte(InflaterInputStream zis) {

try{

            ByteArrayOutputStream bout =newByteArrayOutputStream();

            byte[] temp =new byte[1024];

                byte[] buf =null;

                intlength =0;

                while((length = zis.read(temp,0,1024)) != -1) {

                bout.write(temp,0, length);

        }

                buf = bout.toByteArray();

                bout.close();

                returnbuf;

                }catch(IOException e) {

                e.printStackTrace();

                return null;

        }

}

public staticString join(Object[] o, String flag) {

        StringBuffer str_buff =newStringBuffer();

        for(inti =0, len = o.length; i < len; i++) {

                str_buff.append(String.valueOf(o[i]));

                if(i < len -1)

                str_buff.append(flag);

            }

        returnstr_buff.toString();

}

调用方法:

澳门新濠3559 1

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;

      1.直接获取一个文件的输出流BYTE【】,加上文件的输出目录

前台:文件列表,选中文件,传文件ID集合传到后台

import sun.misc.BASE64Decoder;

      2.或者直接获取一个文件的数据流,在unZipByte方法里直接通过ZIp转化成Zip数据流。

后台:

public class txttest {
/**
*
* @param file
* @return
*澳门新濠3559,/
public static String txt2String(File file){
StringBuilder result = new StringBuilder();
try{
BufferedReader br = new BufferedReader(new FileReader(file));
String s = null;
String str="";
while((s = br.readLine())!=null){
str=str+s;
}
br.close();
base64StringToPDF(str);
}catch(Exception e){
e.printStackTrace();
}
return result.toString();
}

//接受到文件ID集合,查询出文件urlList

public static void main(String[] args){
File file = new File("D:/3.txt");
txt2String(file);
}
public static void base64StringToPDF(String base64sString){
BufferedInputStream bin = null;
FileOutputStream fout = null;
BufferedOutputStream bout = null;
try {
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes = decoder.decodeBuffer(base64sString);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
bin = new BufferedInputStream(bais);
File file = new File("D:/165.png");
fout = new FileOutputStream(file);
bout = new BufferedOutputStream(fout);
byte[] buffers = new byte[1024];
int len = bin.read(buffers);
while(len != -1){
bout.write(buffers, 0, len);
len = bin.read(buffers);
}
bout.flush();

List attachFileList = bookService.findAttachFileList(ids);

} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bin.close();
fout.close();
bout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

List strFiles = new ArrayList();

}

for(AttachFile attachFile : attachFileList){

/**

strFiles.add(attachFile.getAttachFileUrl());

楼主测试的是转成png,转成pdf只需要将后缀修改一下就行

}

**/

//调用打包工具类进行下载

ZipUtil.ZipFiles(getRequest(), getResponse(), strFiles, UUID.randomUUID().toString()+".zip");

直接下载zip包  zipUtil也有

/////////////////////////////////zipUtil  ↓↓↓    ////////////////////

package com.jk.book.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipOutputStream;

public class ZipUtil {

/**

* 把文件打成压缩包并保存在本地硬盘

*

* @param srcfile

* @param zipPath

*/

public static void ZipFiles(List srcfiles, String zipPath) {

    byte[] buf = new byte[4096];

    ZipOutputStream out = null;

    try {

      // 创建zip输出流

      out = new ZipOutputStream(new FileOutputStream(zipPath));

      // 循环将源文件列表添加到zip文件中

      for (int i = 0; i < srcfiles.size(); i++) {

    File file = new File(srcfiles.get(i));

        FileInputStream in = new FileInputStream(file);

        String fileName = file.getName();

        // 将文件名作为zip的Entry存入zip文件中

        out.putNextEntry(new ZipEntry(fileName));

        int len;

        while ( (len = in.read(buf)) > 0) {

          out.write(buf, 0, len);

        }

        out.closeEntry();

        in.close();

      }

    }

    catch (IOException e) {

      e.printStackTrace();

    } finally {

    if (null != out) {

    try {

out.close();

out = null;

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

    }

    }

}

/**

* 把文件打成压缩包并输出到客户端浏览器中

*

* @param request

* @param response

* @param srcFiles

* @param downloadZipFileName

*/

public static void ZipFiles(HttpServletRequest request, HttpServletResponse response, List srcFiles, String downloadZipFileName) {

    byte[] buf = new byte[4096];

    try {

      // Create the ZIP file

    // ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipPath));

    ZipOutputStream out = new ZipOutputStream(response.getOutputStream());//--设置成这样可以不用保存在本地,再输出, 通过response流输出,直接输出到客户端浏览器中。

      // Compress the files

    if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {

    downloadZipFileName = new String(downloadZipFileName.getBytes("GB2312"),"ISO-8859-1");

        } else {

        // 对文件名进行编码处理中文问题

        downloadZipFileName = java.net.URLEncoder.encode(downloadZipFileName, "UTF-8");// 处理中文文件名的问题

        downloadZipFileName = new String(downloadZipFileName.getBytes("UTF-8"), "GBK");// 处理中文文件名的问题

        }

    response.reset(); // 重点突出

        response.setCharacterEncoding("UTF-8"); // 重点突出

        response.setContentType("application/x-msdownload");// 不同类型的文件对应不同的MIME类型 // 重点突出

        // inline在浏览器中直接显示,不提示用户下载

        // attachment弹出对话框,提示用户进行下载保存本地

        // 默认为inline方式

        response.setHeader("Content-Disposition", "attachment;filename="+downloadZipFileName);

      for (int i = 0; i < srcFiles.size(); i++) {

    File file = new File(srcFiles.get(i));

        FileInputStream in = new FileInputStream(file);

        // Add ZIP entry to output stream.

        String fileName = file.getName();

        out.putNextEntry(new ZipEntry(fileName));

        // Transfer bytes from the file to the ZIP file

        int len;

        while ( (len = in.read(buf)) > 0) {

          out.write(buf, 0, len);

        }

        // Complete the entry

        out.closeEntry();

        in.close();

      }

      // Complete the ZIP file

      out.close();

      System.out.println("压缩完成.");

    }

    catch (IOException e) {

      e.printStackTrace();

    }

}

public static void main(String[] args) {

List srcFiles = new ArrayList();

srcFiles.add("c:/codetemplates.xml");

srcFiles.add("d:/t1.png");

ZipFiles(srcFiles, "c:/mm.zip");

}

}

编辑:操作系统 本文来源:压缩时间%3$d,目前的情况是生成文件没有问题

关键词:

  • 上一篇:没有了
  • 下一篇:没有了