package com.boying.service.impl;
|
|
import cn.hutool.core.io.IoUtil;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.boying.common.SystemConfigProperties;
|
import com.boying.entity.EnterPark;
|
import com.boying.entity.FileInfo;
|
import com.boying.mapper.EnterParkMapper;
|
import com.boying.mapper.FileInfoMapper;
|
import com.boying.service.FileInfoService;
|
import lombok.AllArgsConstructor;
|
import org.springframework.http.MediaType;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.FileCopyUtils;
|
|
import javax.servlet.ServletOutputStream;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.*;
|
import java.net.URLEncoder;
|
import java.text.SimpleDateFormat;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.zip.Adler32;
|
import java.util.zip.CheckedOutputStream;
|
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipOutputStream;
|
|
@Service
|
@AllArgsConstructor
|
public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> implements FileInfoService {
|
|
private final SystemConfigProperties systemConfigProperties;
|
private final FileInfoMapper fileInfoMapper;
|
@Override
|
public String downloadPathFile(String downloadPath, HttpServletRequest request, HttpServletResponse response) {
|
//设置文件路径
|
File file = new File(downloadPath);
|
//获取文件名称
|
String fileName = file.getName();
|
//判断文件是否存在
|
if (file.exists()) {
|
response.setContentType("application/force-download");// 设置强制下载不打开
|
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
|
byte[] buffer = new byte[1024];
|
FileInputStream fis = null;
|
BufferedInputStream bis = null;
|
try {
|
fis = new FileInputStream(file);
|
bis = new BufferedInputStream(fis);
|
OutputStream os = response.getOutputStream();
|
int i = bis.read(buffer);
|
while (i != -1) {
|
os.write(buffer, 0, i);
|
i = bis.read(buffer);
|
}
|
file.delete();
|
return "下载成功";
|
} catch (Exception e) {
|
e.printStackTrace();
|
} finally {
|
if (bis != null) {
|
try {
|
bis.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
if (fis != null) {
|
try {
|
fis.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
return "下载失败";
|
}
|
|
@Override
|
public void downForZip(List<FileInfo> fileInfoList, HttpServletRequest req, HttpServletResponse response) {
|
// 创建临时文件
|
File zipFile = null;
|
FileInputStream fis = null;
|
BufferedInputStream buff = null;
|
try {
|
//临时文件名称
|
zipFile = File.createTempFile("test", ".zip");
|
FileOutputStream fot = new FileOutputStream(zipFile);
|
// 为任何OutputStream产生校验,第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
|
CheckedOutputStream cos = new CheckedOutputStream(fot, new Adler32());
|
// 用于将数据压缩成Zip文件格式
|
ZipOutputStream zos = new ZipOutputStream(cos);
|
for (FileInfo file: fileInfoList) {
|
//根据文件信息获取输入流。这个看实际的业务目的就是获取当前文件的输入流
|
InputStream inputStream = new FileInputStream(new File(file.getFileBaseDir()+file.getFileName()+file.getFileLast()));
|
if (null == inputStream) {
|
System.out.println("输入流为空");
|
break;
|
}
|
// 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名
|
//多个文件名称重复时zos.putNextEntry()会报错!! 可以再文件名称后面加编号等操作
|
zos.putNextEntry(new ZipEntry(file.getFileName()+file.getFileLast()));
|
int bytesRead = 0;
|
// 向压缩文件中输出数据
|
while ((bytesRead = inputStream.read()) != -1) {
|
System.out.println("写入数据");
|
zos.write(bytesRead);
|
}
|
inputStream.close();
|
// 当前文件写完,写入下一个文件
|
zos.closeEntry();
|
}
|
zos.close();
|
ServletOutputStream os = response.getOutputStream();
|
//下载文件,使用spring框架中的FileCopyUtils工具
|
//response.setCharacterEncoding("GB2312");
|
response.setContentType("application/octet-stream");
|
//设置响应头,attachment表示以附件的形式下载,inline表示在线打开
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
response.setHeader("Content-Disposition", "attachment;fileName=" + new String((sdf.format(new Date())+".zip").getBytes("utf-8"),"iso8859-1"));
|
fis = new FileInputStream(zipFile);
|
buff = new BufferedInputStream(fis);
|
FileCopyUtils.copy(buff, os);
|
} catch (Exception e1) {
|
System.out.println("批量下载失败");
|
e1.printStackTrace();
|
// 关闭流
|
} finally {
|
try {
|
if (null != fis) {
|
fis.close();
|
}
|
if (null != buff) {
|
buff.close();
|
}
|
} catch (IOException e) {
|
System.out.println("流关闭异常");
|
log.error( "流关闭异常");
|
}
|
// 删除临时文件
|
if (null != zipFile) {
|
zipFile.delete();
|
}
|
}
|
}
|
|
@Override
|
public void downloadPng(FileInfo byId, HttpServletRequest request, HttpServletResponse response) {
|
try {
|
InputStream input = new FileInputStream(new File(byId.getFileBaseDir()+byId.getFileName()+byId.getFileLast()));
|
response.setContentType("application/octet-stream; charset=UTF-8");
|
IoUtil.copy(input, response.getOutputStream());
|
}catch (Exception e){
|
System.out.println("文件读取异常,"+e.getLocalizedMessage());
|
}
|
}
|
|
@Override
|
public void getFile(String downloadPath, HttpServletResponse response) {
|
try {
|
InputStream input = new FileInputStream(new File(systemConfigProperties.getUploadImgPath()+downloadPath));
|
response.setContentType(MediaType.IMAGE_PNG_VALUE);
|
IoUtil.copy(input, response.getOutputStream());
|
}catch (Exception e){
|
System.out.println("文件读取异常,"+e.getLocalizedMessage());
|
}
|
}
|
|
@Override
|
public void getFileById(Long fileId, HttpServletResponse response) {
|
try {
|
FileInfo fileInfo = fileInfoMapper.selectById(fileId);
|
InputStream input = new FileInputStream(new File(fileInfo.getFileBaseDir()+fileInfo.getFileName()+fileInfo.getFileLast()));
|
response.setContentType(MediaType.IMAGE_PNG_VALUE);
|
IoUtil.copy(input, response.getOutputStream());
|
}catch (Exception e){
|
System.out.println("文件读取异常,"+e.getLocalizedMessage());
|
}
|
}
|
}
|