@
目錄
- 前言
- 背景
- 第一步:編寫程式碼
- 1.1 請求層
- 1.2 業務處理層
- 1.3 新增配置
- 第二步:解壓縮處理
- 2.1 引入依賴
- 2.2 解壓縮工具類
- 總結
前言
請各大網友尊重本人原創知識分享,謹記本人部落格:南國以南i、
提示:以下是本篇文章正文內容,下面案例可供參考
背景
在專案出現上傳檔案,其中檔案包含壓縮包,並對壓縮包的內容進行解析儲存。
第一步:編寫程式碼
1.1 請求層
我們用倒敘的方式來寫。先寫 ZipController
@Autowired
private ZipService zipService;
/**
* 上傳二維碼檔案
* @param qrCodeFile 二維碼檔案
* @return 返回上傳的結果
*/
@ApiOperation(value = "上傳二維碼檔案")
@PostMapping("/uploadQrCodeFile")
public Result uploadQrCodeFile(@RequestParam("file") MultipartFile qrCodeFile) throws Exception {
zipService.uploadQrCodeFile(qrCodeFile);
return Result.sendSuccess("上傳成功");
}
1.2 業務處理層
接著就是寫 Service
@Service
public class ZipService {
private static final Logger logger= LoggerFactory.getLogger(ZipService.class);
public void uploadQrCodeFile(MultipartFile multipartFile)throws Exception {
if (multipartFile.getSize() == 0
|| multipartFile.getOriginalFilename() == null
|| (multipartFile.getOriginalFilename() != null
&& !multipartFile.getOriginalFilename().contains("."))) {
ExceptionCast.cast(Result.sendFailure("檔案格式不正確或檔案為空!"));
}
// 1.先下載檔案到本地
String originalFilename = multipartFile.getOriginalFilename();
String destPath = System.getProperty("user.dir") + File.separator + "qrCodeFile";
FileUtil.writeFromStream(
multipartFile.getInputStream(), new File(destPath + File.separator + originalFilename));
// 2.解壓檔案
unzipAndSaveFileInfo(originalFilename, destPath);
// 3.備份壓縮檔案,刪除解壓的目錄
FileUtils.copyFile(
new File(destPath + File.separator + originalFilename),
new File(destPath + File.separator + "backup" + File.separator + originalFilename));
// 刪除原來的上傳的臨時壓縮包
FileUtils.deleteQuietly(new File(destPath + File.separator + originalFilename));
logger.info("檔案上傳成功,檔名為:{}", originalFilename);
}
/**
* 解壓和儲存檔案資訊
*
* @param originalFilename 原始檔名稱
* @param destPath 目標路徑
*/
private void unzipAndSaveFileInfo(String originalFilename, String destPath) throws IOException {
if (StringUtils.isEmpty(originalFilename) || !originalFilename.contains(".")) {
ExceptionCast.cast(Result.sendFailure("檔名錯誤!"));
}
// 壓縮
ZipUtil.unzip(
new File(destPath + File.separator + originalFilename),
new File(destPath),
Charset.forName("GBK"));
// 遍歷檔案資訊
String fileName = originalFilename.substring(0, originalFilename.lastIndexOf("."));
File[] files = FileUtil.ls(destPath + File.separator + fileName);
if (files.length == 0) {
ExceptionCast.cast(Result.sendFailure("上傳檔案為空!"));
}
String targetPath = destPath + File.separator + "images";
for (File file : files) {
// 複製檔案到指定目錄
String saveFileName =
System.currentTimeMillis() + new SecureRandom().nextInt(100) + file.getName();
FileUtils.copyFile(file, new File(targetPath + File.separator + saveFileName));
logger.info("檔名稱:"+file.getName());
logger.info("檔案所在目錄地址:"+saveFileName);
logger.info("檔案所在目錄地址:"+targetPath + File.separator + saveFileName);
}
}
}
1.3 新增配置
因spring boot有預設上傳檔案大小限制,故需配置檔案大小。在 application.properties
中新增 upload
的配置
#### upload begin ###
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.max-file-size=10MB
#### upload end ###
第二步:解壓縮處理
2.1 引入依賴
引入 Apache
解壓 / 壓縮 工具類處理,解壓 tar.gz
檔案
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.20</version>
</dependency>
2.2 解壓縮工具類
- 將
tar.gz
轉換為tar
- 解壓
tar
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
// tar.gz 檔案路徑
String sourcePath = "D:\\daleyzou.tar.gz";
// 要解壓到的目錄
String extractPath = "D:\\test\\daleyzou";
File sourceFile = new File(sourcePath);
// decompressing *.tar.gz files to tar
TarArchiveInputStream fin = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(sourceFile)));
File extraceFolder = new File(extractPath);
TarArchiveEntry entry;
// 將 tar 檔案解壓到 extractPath 目錄下
while ((entry = fin.getNextTarEntry()) != null) {
if (entry.isDirectory()) {
continue;
}
File curfile = new File(extraceFolder, entry.getName());
File parent = curfile.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
// 將檔案寫出到解壓的目錄
IOUtils.copy(fin, new FileOutputStream(curfile));
}
總結
我是南國以南i記錄點滴每天成長一點點,學習是永無止境的!轉載請附原文連結!!!
參考連結、參考連結、