java 文件流的处理 文件打包成zip
1、下载文件到本地
1
2
3
4
5
6
7
8
9
10
11
|
public void download(HttpServletResponse response){
String filePath = "" ; //文件路径
String fileName = "" ; //文件名称
// 读到流中
InputStream inStream = new FileInputStream(filePath);
// 设置输出的格式
response.reset();
response.setContentType( "bin" );
response.addHeader( "Content-Disposition" , "attachment; filename=\"" + fileName + "\"" );
IOUtils.copy(inStream, response.getOutputStream());
}
|
2、java后端下载
方式一:
1
|
new URL(fileUrl + item.getcBhFileserver()).openStream()
|
方法二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public Boolean addFile(String url, String id, String fileName) {
RequestCallback requestCallBack = new RequestCallback() {
@Override
public void doWithRequest(ClientHttpRequest request) throws IOException {
request.getHeaders().add( "accept" , MediaType.APPLICATION_OCTET_STREAM_VALUE);
}
};
ResponseExtractor<Boolean> responseExtractor = new ResponseExtractor<Boolean>() {
@Override
public Boolean extractData(ClientHttpResponse response) throws IOException {
if (response.getStatusCode() == HttpStatus.OK) {
//得到文件流
InputStream input = response.getBody();
return true ;
}
return false ;
}
};
return restTemplate.execute(url, HttpMethod.GET, requestCallBack, responseExtractor, id);
}
|
3、文件打包成zip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public void zipFilesAll() throws Exception {
String zipPath = "" ; //zip包路径
String zipFileName = "" ; //zip包名称
File zipFile = new File(zipFileName .toString());
// 创建 FileOutputStream 对象
FileOutputStream fileOutputStream = null ;
// 创建 ZipOutputStream
ZipOutputStream zipOutputStream = null ;
try {
//创建文件夹
zipFile = new File(zipPath );
FileUtils.forceMkdir(zipFile);
//创建文件
zipFile = new File(zipFileName .toString());
if (!zipFile.exists()) {
zipFile.createNewFile();
}
// 实例化 FileOutputStream 对象
fileOutputStream = new FileOutputStream(zipFileName.toString());
// 实例化 ZipOutputStream 对象
zipOutputStream = new ZipOutputStream(fileOutputStream);
// 创建 ZipEntry 对象
ZipEntry zipEntry = null ;
for (CL cl: ClList) {
// 实例化 ZipEntry 对象,源文件数组中的当前文件
zipEntry = new ZipEntry(tCltjjl.getcClmc() + ".zip" );
zipOutputStream.putNextEntry(zipEntry);
IOUtils.copy( new FileInputStream(cl.getcPath(), zipOutputStream);
}
} catch (Exception e) {
} finally {
//记得删除文件
}
}
|
后台多文件打包成zip返回流 前台提供按钮一键下载
项目pom文件添加二维码操作,和文件打包的maven支持:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!--二维码相关 start-->
< dependency >
< groupId >net.glxn.qrgen</ groupId >
< artifactId >javase</ artifactId >
< version >2.0</ version >
</ dependency >
<!--二维码相关 end-->
<!--文件打包相关 start-->
< dependency >
< groupId >org.apache.commons</ groupId >
< artifactId >commons-compress</ artifactId >
< version >1.12</ version >
</ dependency >
<!--文件打包相关 end-->
|
前台代码:
1
|
< button type = "button" onclick = "downloadzip()" >下载</ button >
|
js(我用了thymeleaf模板)代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<script th:inline= "javascript" >
function downloadzip(){
var storeType = $( "#storeType" ).val();
if (storeType == "" ){
bootAlertError( "请选择门店!" );
return ;
}
var url = [[@{/downLoadProductQrCode/getStreamZip}]];
//模拟form表单 返回打包流
var form = $( '<form method= "POST" action="' + url + '" enctyped="multipart/form-data">' +
'<input name= "agencyId" type= "hidden" value="' +storeType+ '" />'
+ '</form>' );
form. appendTo( 'body' ). submit(). remove();
}
</script>
|
后台代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
/**
* @Author Ni Klaus
* @Description //TODO 门店总代生成打包产品二维码zip
* @Date 上午 10:38 2019/8/20 0020
* @Param [params,response]
* @return void
**/
@RequestMapping ({ "getStreamZip" })
@ResponseBody
public void findList( @RequestParam Map params,HttpServletResponse response) throws Exception {
String agencyId = (String) params.get( "agencyId" );
AgencyAccount agencyAccount = agencyAccountService.getAccountByAgencyId(agencyId);
//这里设置打包后的zip文件名
String downloadName = agencyAccount.getName()+ ".zip" ;
try {
response.setContentType( "multipart/form-data" );
response.setHeader( "Content-Disposition" , "attachment;fileName=" + new String(downloadName.getBytes(), "ISO8859-1" ));
} catch (UnsupportedEncodingException e){
log.error( "----------下载文件名编码时出现错误------" +e.getMessage());
}
OutputStream outputStream = response.getOutputStream();
ZipArchiveOutputStream zous = new ZipArchiveOutputStream(outputStream);
zous.setUseZip64(Zip64Mode.AsNeeded);
zous.setEncoding( "utf-8" );
try {
//我这里是通过不同产品类型生成不同产品的二维码图片流
//具体你想生成什么类型的多个文件打包,只需要循环创建ArchiveEntry 然后zous.putArchiveEntry(entry)就可以了
StoreProductType[] storeProductTypes = StoreProductType.values();
for (StoreProductType storeProductType : storeProductTypes) {
String url = "http://m.xxx.cn/goods/pay/xxx.html?productid=" +storeProductType.getProductId()
+ "&agencycode=" + agencyId + "&channelid=def&appfrom=sqjk&isstore=1" ;
//打包文件里的每个文件的名字
String imgName = storeProductType.getDescription()+ ".png" ;
ByteArrayOutputStream out = QRCode.from(url).to(ImageType.PNG).withSize( 300 , 300 ).stream();
byte [] bytes = out.toByteArray();
ArchiveEntry entry = new ZipArchiveEntry(imgName);
zous.putArchiveEntry(entry);
zous.write(bytes);
zous.closeArchiveEntry();
if (out != null ) {
out.close();
}
}
} catch (Exception e){
e.printStackTrace();
log.error( "---------------门店总代生成二维码打包流出错----------------" +e.getMessage());
} finally {
if (outputStream != null ){
outputStream.close();
}
if (zous != null ){
zous.close();
}
}
}
|
最后效果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/jiehanshi/p/11533465.html