ZipUtil:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Objects; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * @author 47Gamer * @date: 2019/11/11 14:47 * @Description: */ public class ZipUtil { private static Logger logger = LoggerFactory.getLogger(ZipUtil.class); private static final String TARGET_PACKAGE = "target"; public static void exportZip(OutputStream out, String rootPath, String fileName) { File zipfile = null; File targetDirectory = null; InputStream fin = null; String source = rootPath + File.separator + fileName; String target = rootPath + File.separator + TARGET_PACKAGE; String targetFile = target + File.separator + fileName + ".zip"; try { targetDirectory = new File(target); targetDirectory.mkdirs(); //压缩目录 ZipUtil.createZip(source, targetFile); //根据路径获取刚生成的zip包文件 zipfile = new File(targetFile); fin = new FileInputStream(zipfile); byte[] buffer = new byte[512]; // 缓冲区 int bytesToRead = -1; // 通过循环将读入的Word文件的内容输出到浏览器中 while ((bytesToRead = fin.read(buffer)) != -1) { out.write(buffer, 0, bytesToRead); } } catch (Exception e) { logger.error("ZipUtils exportZip error:" + e.getMessage()); } finally { try { if (fin != null) fin.close(); if (out != null) out.close(); if (zipfile != null) { zipfile.delete(); } if (targetDirectory != null) { //递归删除目录及目录下文件 ZipUtil.deleteFile(targetDirectory); } } catch (Exception e2) { logger.error("ZipUtils closing stream error:" + e2.getMessage()); } } } /** * 创建ZIP文件 * * @param sourcePath 文件或文件夹路径 * @param zipPath 生成的zip文件存在路径(包括文件名) */ public static void createZip(String sourcePath, String zipPath) { FileOutputStream fos = null; ZipOutputStream zos = null; try { fos = new FileOutputStream(zipPath); zos = new ZipOutputStream(fos); writeZip(new File(sourcePath), "", zos); } catch (FileNotFoundException e) { logger.error("ZipUtils createZip Failed to create ZIP file", e); } finally { try { if (zos != null) { logger.debug("ZipUtils createZip Create a ZIP file successfully! the path in:{}", zipPath); zos.close(); } } catch (IOException e) { logger.error("ZipUtils createZip Failed to create ZIP file", e); } } } private static void writeZip(File file, String parentPath, ZipOutputStream zos) { if (file.exists()) { if (file.isDirectory()) {// 处理文件夹 parentPath += file.getName() + File.separator; File[] files = file.listFiles(); if (Objects.nonNull(files)){ for (File f : files) { writeZip(f, parentPath, zos); } } } else { FileInputStream fis = null; try { fis = new FileInputStream(file); ZipEntry ze = new ZipEntry(parentPath + file.getName()); zos.putNextEntry(ze); byte[] content = new byte[1024]; int len; while ((len = fis.read(content)) != -1) { zos.write(content, 0, len); zos.flush(); } } catch (IOException e) { logger.error("ZipUtils createZip Failed to create ZIP file", e); } finally { try { if (fis != null) { fis.close(); } } catch (IOException e) { logger.error("ZipUtils createZip Failed to create ZIP file", e); } } } } } /** * 删除文件夹 * * @param file */ public static void deleteFile(File file) { if (Objects.isNull(file) || !file.exists()){ return; } if (file.isDirectory()) { File[] files = file.listFiles(); if (Objects.nonNull(files)){ for (File subFile : files) { deleteFile(subFile); } } } file.delete(); } }
上报:
private static final String CACHE_ROOT = "自定义文件路径"; //生成文件到缓存目录,压缩上报 private void cacheAndUploadFile(List<Object> list, String fileName, String uploadPath) { //生成UUID(可自己写,代码就不贴出来了) String uuid = IdUtil.generateUUID(); String dir = CACHE_ROOT + File.separator + uuid; File dirFile = new File(dir); String csvFullName = dir + File.separator + fileName + ".csv"; String excelFullName = dir + File.separator + fileName + ".xls"; String zipName = fileName + ".csv.zip"; String zipFullName = dir + File.separator + zipName; //生成xml文件到缓存目录 if (!dirFile.exists()) { dirFile.mkdirs(); } //转换Excel //covertToExcel(list, dir, fileName + ".xls"); //POIUtil.excel2Csv(excelFullName, csvFullName); //压缩为zip文件 ZipUtil.createZip(csvFullName, zipFullName); //上报 upload(zipFullName, uploadPath); //删除缓存文件 ZipUtil.deleteFile(dirFile); }
upload方法:
@Autowired RemoteFileTemplate remoteFileTemplate; //上报 private void upload(String sourceFullName, String uploadPath) { File sourceFile = new File(sourceFullName); try { Message<File> message = MessageBuilder.withPayload(sourceFile).build(); remoteFileTemplate.send(message, uploadPath); } catch (Exception e) { logger.error("Upload file error, sourceFullName[{}], uploadPath[{}]", sourceFullName, uploadPath, e); } }
获取上报路径:
//获取上报路径 private String getFilePath(String city, String vendor, String date) { String remoteFileSeparator = remoteFileTemplate.getRemoteFileSeparator(); StringBuilder builder = new StringBuilder(); builder .append(remoteDirectory).append(remoteFileSeparator)//remoteDirectory为FTP文件路径 .append("var").append(remoteFileSeparator) //自定义随便写 .append("file").append(remoteFileSeparator)//自定义随便写
.append(date);
return builder.toString();
}
导入jar(版本就选4.3.17吧):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-ftp</artifactId> </dependency>
FTP配置:
@Configuration public class Ftpconfig { @Value("${upload.ftp.host}") private String host; @Value("${upload.ftp.port}") private int port; @Value("${upload.ftp.userName}") private String userName; @Value("${upload.ftp.password}") private String password; @Value("${upload.ftp.remoteDirectory}") private String remoteDirectory; @Value("${upload.ftp.temporaryFileSuffix}") private String temporaryFileSuffix; @Value("${upload.ftp.useTemporaryFileName}") private boolean useTemporaryFileName; @Value("${upload.ftp.autoCreateDirectory}") private boolean autoCreateDirectory; @Bean public SessionFactory<FTPFile> ftpSessionFactory() { DefaultFtpSessionFactory factory = new DefaultFtpSessionFactory(); factory.setHost(host); factory.setPort(port); factory.setUsername(userName); factory.setPassword(password); return new CachingSessionFactory<FTPFile>(factory); } @Bean public RemoteFileTemplate remoteFileTemplate(){ RemoteFileTemplate template = new FtpRemoteFileTemplate(ftpSessionFactory()); template.setRemoteDirectoryExpression(new LiteralExpression(remoteDirectory)); template.setTemporaryFileSuffix(temporaryFileSuffix); template.setUseTemporaryFileName(useTemporaryFileName); template.setAutoCreateDirectory(autoCreateDirectory); return template; }
配置:
upload: ftp: host: 127.0.0.1 port: 21 userName: root password: root remoteDirectory: '' temporaryFileSuffix: .tmp useTemporaryFileName: true autoCreateDirectory: true