首先将文件读取进来
读取文件内容,根据文件的不同,读取的方式不同,像本地文件,或是在数据库中储存的原文;
本地文件直接用io流读取即可,数据库中有时候会储存原文,这时候只需要将内容写人文件就可以了;
因为工作要求数据库存原文,所以我只要在数据库中查找到我要的原文数据,写入到文件就可以;
使用List集合接收查到的数据集合
在这里演示就是用假数据代替查找的数据
public static List<String> strListTestData(){
List<String> strings = new ArrayList<String>();
strings.add("MIICZzCCAg2zIwMTkxMjE4MDEzNDIyWhgPMjAyMDEyMTgwMTM0MjJaMIGdMQswCQYDVQQGEwJDTjEgMB4GCSqGSIb3DQEJARYRMTIyOTkwMDYwMEBxcS5jb20xCzAJBgNVBAgTAjEyMMCA8gwHwYDVR0jBBgwFoAUjBra/T15AMMHdeSyss/tAO06BeowCgYIKoEcz1UBg3UDSAAwRQIgZhtzQq8g4Cx1k+Wc0aRiUHOMyku3hGn1ea5zePwFOy8CIQDlkXmnQYfgrdeBVaV8TWRCWx2vuxkb7vnAnSMP9NgwIQ==");
strings.add("MIICZzCCAg21UEAxMJYW53ZWl0ZWNoMCIYDzIwMTkxMjE4MDEzNDIyWhgPMjAyMDEyMTgwMTM0MjJaMIGdMQswCQYDVQQGEwJDTjEgMB4GCSqGSIb3DQEJARYRMTIyOTkwMDYwMEBxcS5jbFfMTIzNDU2z1UBg3UDSAAwRQIgZhtzQq8g4Cx1k+Wc0aRiUHOMyku3hGn1ea5zePwFOy8CIQDlkXmnQYfgrdeBVaV8TWRCWx2vuxkb7vnAnSMP9NgwIQ==");
strings.add("MIICZzCCAg2GA1UEAxMJYW53ZWl0ZWNoMCIYDzIwMTkxMjE4MDEzNDIyWhgPMjAyMDEyMTgwMTM0MjJaMIGdMQswCQYDVQQGEwJDTjEgMB4GCSqGSIb3DQEJARYRMTIyOTkwMDYwMEBxTFfMTIzND1UBg3UDSAAwRQIgZhtzQq8g4Cx1k+Wc0aRiUHOMyku3hGn1ea5zePwFOy8CIQDlkXmnQYfgrdeBVaV8TWRCWx2vuxkb7vnAnSMP9NgwIQ==");
strings.add("MICZzCCAg20MjJaMIGdMQswCQYDVQQGEwJDTjEgMB4GCSqGSIb3DQEJARYRMTIyOTkwMDYwMEBxcS5jb20xCzAJBgNVBAgTAjEyMQ0wCwYDVQQHEwQwMDAwMQswCQYDVQQKEwIwMTENMAsGA1UECA8gwHwYDVR0jBBgwFoAUjBra/T15AMMHdeSyss/tAO06BeowCgYIKoEcz1UBg3UDSAAwRQIgZhtzQq8g4Cx1k+Wc0aRiUHOMyku3hGn1ea5zePwFOy8CIQDlkXmnQYfgrdeBVaV8TWRCWx2vuxkb7vnAnSMP9NgwIQ==");
return strings;
}
一共有4条数据需要生成文件下载,只有几KB,产生临时文件还需要定时清理,因为写入文件是使用IO流 ,是以Baye[]类型数组写入,所以我们将数据直接转换成baye[] 类型数组;
创建一个HashMap集合,键为文件名,值为原文
多文件压缩或读取时文件名要保持唯一,可以用UUID或者是时间与循环次数作为文件名字;
使用UUID生成文件名;
String fileName= UUID.randomUUID().toString().replace("-", "");
System.out.println(fileName);
使用时间格式类型生成文件名;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String fileTimeName = simpleDateFormat.format(new Date());
System.out.println(fileTimeName);
这里我为了保证文件的唯一性,使用的时间和UUID作为文件名
public static Map<String,byte[]> newCERFile(List<String> strList) {
//创建一个HashMap集合 key为文件名 value为源文件转后的值
Map<String, byte[]> stringMap = new HashMap<String, byte[]>();
//遍历接收到的集合
for (String s : strList) {
//转为byte[]
byte[] sourceByte = s.getBytes();
if (null != sourceByte) {
//当前时间字符创
SimpleDateFormat timeName = new SimpleDateFormat("yyyyMMddhhmmss");
//UUID
String uuidName = UUID.randomUUID().toString().replace("-","");
//key为文件名 value为源文件转后的值
stringMap.put(timeName.format(new Date())+uuidName+".cer",sourceByte);
}
}
return stringMap;
}
边压缩ZIP格式文件边下载(直接输出ZIP流)
下载时候需要告诉浏览器文件类型,这里配置文件写在了后端
@RequestMapping("/download")
public void downloadCERService(HttpServletResponse response){
Map<String, byte[]> stringByte= newCERFile(strListTestData());
// 配置文件下载
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
//压缩包文件名
SimpleDateFormat fileZipName = new SimpleDateFormat("yyyyMMddhhmmss");
// 下载文件时候防止显示中文乱码 指定文件类型 .zip
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileZipName.format(new Date())+".zip", "UTF-8"));
//将文件打包成压缩文件
ZipOutputStream zipout = new ZipOutputStream(response.getOutputStream());
Set<Map.Entry<String, byte[]>> dataEntrys = stringByte.entrySet();
for (Map.Entry<String, byte[]> data : dataEntrys) {
InputStream bufferIn = new BufferedInputStream( new ByteArrayInputStream(data.getValue()) );
byte[] bs = new byte[1024];
Arrays.fill(bs, (byte) 0);
//创建压缩文件内的文件
zipout.putNextEntry(new ZipEntry(data.getKey()));
int len = -1;
while ((len = bufferIn.read(bs)) > 0) {
zipout.write(bs, 0, len);
}
bufferIn.close();
}
try {
zipout.close();
} catch (IOException e) {
}
}
为了方便给大家展示,截取改动了部分代码及结构;
这时候直接打开服务器访问http://localhost:8080/download