文件下载,压缩包生成
1.文件下载
1.网上文件下载,一抓一大把。分享下一下资源
package io.renren.archives.controller;
import cn.hutool.core.util.ObjectUtil;
import io.renren.archives.entity.ReUploadFile;
import io.renren.archives.service.ReUploadFileService;
import io.renren.common.utils.DownFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @program: campus
* @description: 上传文件
* @author: shenzy
* @create: 2020-08-10 09:11
**/
@Controller
@RequestMapping("/upload")
public class ReDownLoadController {
/**
* 存放根目录
*/
@Value("${rr.catalogs}")
private String catalogs; // 磁盘盘符
@Autowired
private ReUploadFileService reUploadFileService;
/**
* 通过文件上传管理id下载文件
* @param response
* @param request
* @param id
* @return
*/
@GetMapping("/downfileById")
@ResponseBody
public String downfileById(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "id") Long id){
ReUploadFile reUploadFile = reUploadFileService.getById(id);
try{
if (ObjectUtil.isNotNull(reUploadFile)){
String filepath=catalogs+reUploadFile.getFileUrl();//D:/挂接文件/185fd11ae1314601822382bcef57626c-web前端开发工程师.pdf
String suffix=reUploadFile.getFileUrl().substring(reUploadFile.getFileUrl().lastIndexOf("."));
String fileName = reUploadFile.getFileName();
DownFile.downFile(response,request,filepath,fileName+suffix);
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
package com.cloudwis.campus.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
/**
* @program: campus
* @description: 下载文件
* @author: shenzy
* @create: 2020-08-13 16:00
**/
public class DownFile {
public static void downFile(HttpServletResponse response, HttpServletRequest request, String path, String fileName) throws IOException {
/** 将文件名称进行编码 */
response.setContentType("content-type:octet-stream");
if (DownFile.isMSBrowser(request)) {
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-disposition",
"attachment;filename=" +fileName);// 设置头部信息
} else {
fileName = new String(fileName.getBytes(), "ISO8859-1");
response.setHeader("Content-disposition",
"attachment;filename=" +fileName);// 设置头部信息
}
File file = new File(path);
if(!file.exists()){
throw new FileNotFoundException("文件不存在");
}
/** 读取服务器端模板文件*/
InputStream inputStream = new FileInputStream(file);
/** 将流中内容写出去 .*/
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
inputStream.close();
outputStream.close();
}
//判断是否是ie浏览器,来处理下载文件名称乱码问题
public static boolean isMSBrowser(HttpServletRequest request) {
String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
String userAgent = request.getHeader("User-Agent");
for (String signal : IEBrowserSignals) {
if (userAgent.contains(signal)){
return true;
}
}
return false;
}
}
2.多级文件生成压缩包
2.1 创建一个文件数组
2.2 maps是返回的多级路径
2.3 FileUtil.file(catalogs + fileUrl)封装, 放到数组里面
2.4 引用hutool依赖,压缩工具类很方便
2.5 生成的路径就在 根目录引用的路径在这里插入代码片
File[] files = new File[maps.size()];
if (maps.size()>0){
for (int i = 0; i < maps.size(); i++) {
String fileUrl = maps.get(i).get("fileUrl").toString();
files[i] = FileUtil.file(catalogs + fileUrl);
}
}
String rchivesName= UUID.randomUUID() + reArchivesType.getArchivesName();
ZipUtil.zip(FileUtil.file(catalogs +rchivesName +".zip"), false, files);
String url = rchivesName+".zip";
File files1 = new File(catalogs+url);
String fileSize = getNetFileSizeDescription(files1.length());
这里是压缩包的大小自动转换,很方便
/**
* 压缩包大小转对应的大小
* @param size
* @return
*/
public static String getNetFileSizeDescription(long size) {
StringBuffer bytes = new StringBuffer();
DecimalFormat format = new DecimalFormat("###.0");
if (size >= 1024 * 1024 * 1024) {
double i = (size / (1024.0 * 1024.0 * 1024.0));
bytes.append(format.format(i)).append("GB");
}
else if (size >= 1024 * 1024) {
double i = (size / (1024.0 * 1024.0));
bytes.append(format.format(i)).append("MB");
}
else if (size >= 1024) {
double i = (size / (1024.0));
bytes.append(format.format(i)).append("KB");
}
else if (size < 1024) {
if (size <= 0) {
bytes.append("0B");
}
else {
bytes.append((int) size).append("B");
}
}
return bytes.toString();
}