版权声明:本文由 低调小熊猫 发表于 低调小熊猫的博客
转载声明:自由转载-非商用-非衍生-保持署名,非商业转载请注明作者及出处,商业转载请联系作者本人qq:2696284032
文章链接: https://aodeng.cc/archives/javaosszipdown
阿里oss对象存储官方文档我看了,但是真实开发,还不能满足需求,阿里文件下载路径只能写死,下载文件也只能单个下载,所以自己整理了一些代码,下载时可以自己选择保存的路径,可以实现多个文件同时下载,不吹逼了,反正很厉害就是了,话不多说,上代码
1.自己封装的工具包的代码
https://aodeng.cc/archives/ossutil
2.页面发送请求的代码
<td>
<a class="btn btn-mini btn-danger" style="width: 88px;height:30px;margin-top: -25px" href="${pageContext.request.contextPath}/pproject/ossdownfile?projectId=${projectId}">
下载
</a>
</td>
/**
* oss文件下载
*/
@RequestMapping("/ossdownfile")
public void ossdownfile(HttpServletRequest request,HttpServletResponse response,@RequestParam(value="projectId",required=false) long projectId) throws Exception{
try {
//-----------------------批量下载文件------------------------//
//获取文件名称
String Name=pprojectService.findOne(projectId).getCheckFileName();
//模拟文件
String fileName = request.getSession().getServletContext().getRealPath("tmp/check/")+"/"+projectId+"/"+Name;
// 创建临时文件
File zipFile = File.createTempFile("temp", ".zip");
FileOutputStream fps = new FileOutputStream(zipFile);
CheckedOutputStream csum = new CheckedOutputStream(fps, new Adler32());//注释一下Adler32(较快)和CRC32两种
// 用于将数据压缩成Zip文件格式
ZipOutputStream zos = new ZipOutputStream(csum);
//获取文件的name并拼接成key,下载文件
File f = new File(PathUtil.getRealPath()+"//tmp//files//"+projectId);
if(f.exists()){
File[] fs = f.listFiles();
if(null!=fs){
for(File file0:fs){
//善意的提醒一下,key不能以任何形式的斜杠开头
InputStream inputStream = ossUtil.getObjectForInputStream("files/"+projectId+"/"+file0.getName()).getObjectContent();
zos.putNextEntry(new ZipEntry(file0.getName()));//确保压缩包里面文件不同名
int bytesRead = 0;
// 向压缩文件中输出数据
while((bytesRead=inputStream.read())!=-1){
zos.write(bytesRead);
}
inputStream.close();
zos.closeEntry();
}
}
}
zos.close();
//转码,免得文件名中文乱码
Name = URLEncoder.encode(Name,"UTF-8");
//设置文件下载头
response.addHeader("Content-Disposition", "attachment;filename=" + Name);
//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("application/octet-stream");
//写入文件
FileInputStream fis = new FileInputStream(zipFile);
BufferedInputStream buff = new BufferedInputStream(fis);
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
//通知浏览器以附件形式下载
response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(Name,"utf-8"));
byte[] car=new byte[1024];
int L=0;
while (L < zipFile.length()) {
int j = buff.read(car, 0, 1024);
L += j;
out.write(car, 0, j);
}
if(out!=null){
out.flush();
out.close();
}
ossUtil.clientShutdown();
// 删除文件
zipFile.delete();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}