1.本文概述
1.1 本文簡(jiǎn)介
本文會(huì)包含
- java 文件校驗(yàn)
- 文件上傳
- 文件壓縮
- zip文件的解壓
- oss的文件上傳
- oss前端上傳
2. 功能實(shí)現(xiàn)
文章像齒輪一樣, 部分位置需要自己組裝滿足不同業(yè)務(wù)需求
需要哪個(gè)就加哪個(gè) 注意類型和位置即可注釋都是很全的
如果在使用中 遇到問(wèn)題歡迎評(píng)論區(qū)指正
2.1 統(tǒng)一文件校驗(yàn)
===> 傳送門: MultipartFile 統(tǒng)一文件校驗(yàn)
2.2 普通(多)文件上傳[服務(wù)器]
支持
單/多文件
同時(shí)上傳 部分service方法 這個(gè)都隨意 滿足springboot標(biāo)準(zhǔn)即可
2.2.1 controller層
/**
* 普通文件上傳
* @param
* @return
*/
@ApiOperation("==> 普通文件上傳 <===")
@RequestMapping(value = "/fileUpload", method = RequestMethod.POST)
public ResultResponse fileUpload(MultipartFile[] file, PageVo pageVo) {
log.info("===> 普通文件上傳 <===");
ResultResponse result = ossAddService.fileUpload(file, pageVo.getSearchName());
log.info("返回用戶信息:{}", result);
return result;
}
2.2.2 service層
ResultResponse fileUpload(MultipartFile[] file, String searchName);
2.2.3 業(yè)務(wù)impl實(shí)現(xiàn)類
@SneakyThrows
@Override
public ResultResponse fileUpload(MultipartFile[] file, String searchName) {
//文件上傳功能
String str = FileIOUtils.fileUpload(file, searchName, false);
return ResultResponse.ok().setData(str);
}
2.2.4 FileIOUtils工具包代碼
注意: 有報(bào)錯(cuò)的位置
注釋掉
即可 , 自己的業(yè)務(wù)代碼
- throw異常位置 換成
RuntimeException
(“我是異?!? 即可ZipUtil.unzip()
解壓的方法 根據(jù)后綴名 是zip進(jìn)行解壓
后面有介紹->2.3不需要可以直接注釋
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;
/**
* 文件上傳工具類
*
* @author pzy
* @version 0.1.0
* @description TODO
*/
@Slf4j
public class FileIOUtils {
/**
* 文件上傳
*
* @param file 上傳文件
* @param uploadPath 上傳文件路徑
* @param isRandomFileName 是否是隨機(jī)的文件名 true:是 false:否
* @return
*/
@SneakyThrows
public static String fileUpload(MultipartFile[] file, String uploadPath, boolean isRandomFileName) {
//上傳目錄地址
log.debug(uploadPath);
//(最新修改)如果目錄不存在,自動(dòng)創(chuàng)建文件夾(修復(fù))
if (!FileIOUtils.createFile(1, new File(uploadPath), false)) {
log.error("-------> 自動(dòng)創(chuàng)建文件或文件夾失敗!!! <--------");
}
//之后可以 優(yōu)化 根據(jù)配置文件自動(dòng)配置 mkdir-
String suffix = null;
String fileName = null;
// HashMap hashMap = new HashMap();
FileOutputStream fileOutputStream = null;
try {
//遍歷文件數(shù)組執(zhí)行上傳(多文件上傳需要)
for (MultipartFile multipartFile : file) {
if (multipartFile != null) {
log.debug("開始上傳文件.......");
//調(diào)用上傳方法
suffix = Objects.requireNonNull(multipartFile.getOriginalFilename()).substring(multipartFile.getOriginalFilename().lastIndexOf(".")); //后綴名
//文件名 是隨機(jī) 就uuid 不是隨機(jī)就是原名
fileName = (isRandomFileName ? UUID.randomUUID() + suffix : multipartFile.getOriginalFilename());
fileOutputStream = new FileOutputStream(uploadPath + "/" + fileName);
IOUtils.copy(multipartFile.getInputStream(), fileOutputStream);
//file[i].transferTo(new File(uploadDir+"/"+fileName));
log.debug("上傳" + uploadPath + "/" + fileName + "文件成功!");
/*不是隨機(jī)文件上傳 并且是 zip 解壓*/
if (!isRandomFileName && Objects.equals(suffix, ".zip")) {
//解壓文件夾
ZipUtil.unzip(uploadPath + "/" + fileName, uploadPath);
}
}
}
log.debug("上傳結(jié)束!所有文件上傳文件至:" + uploadPath);
System.out.printf("文件名->%s\n", fileName);
return fileName;
} catch (Exception e) {
//打印錯(cuò)誤堆棧信息
e.printStackTrace();
log.error("上傳文件失敗,請(qǐng)檢查后重試!!!");
throw new ThirdServiceException(ResponseEnum.T160004);
} finally {
if (fileOutputStream != null) {
fileOutputStream.close();
}
}
}
/**
* 判斷文件是否存在,不存在就創(chuàng)建
*
* @param file
*/
public static boolean createFile(int type, File file, Boolean flag) {
if (type == 1) {
if (!file.exists()) {
return file.mkdirs();
}
}
//其他就是0 文件及目錄創(chuàng)建(存在bug)
if (file.exists()) {
log.debug("文件及相關(guān)路徑存在!!!");
} else {
log.info("文件不存在 ,創(chuàng)建文件以及文件夾 ...");
//getParentFile() 獲取上級(jí)目錄(包含文件名時(shí)無(wú)法直接創(chuàng)建目錄的)
if (!file.getParentFile().exists()) {
log.info("文件及其路徑不存在, 創(chuàng)建路徑文件!!!");
//創(chuàng)建層級(jí)目錄
if (!file.getParentFile().mkdirs()) {
return false;
}
}
if (flag) {
try {
//上層目錄創(chuàng)建文件
log.info("文件夾創(chuàng)建開啟,在上層目錄下創(chuàng)建文件夾");
if (file.createNewFile()) {
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
/**
* 文件刪除回收
*
* @param path
*/
public static boolean fileGCDelete(String path) {
boolean flag = false;
File file1 = new File(path);
if (file1.exists()) {
flag = file1.delete();
try {
do {
if (!flag) {
System.gc(); //回收資源
flag = file1.delete();
}
} while (!flag);
} catch (Exception e) {
e.printStackTrace();
}
log.debug("路徑存在" + flag);
}
return flag;
}
}
2.3 zip文件的解壓
文件壓縮工具包 使用
java.util.zip
包
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* 解壓文件工具類
*
* @author pzy
* @version 0.1.0
* @description TODO
*/
@Slf4j
public class ZipUtil {
/**
* 解壓核心功能
* @param zipFilePath 文件目標(biāo)路徑
* @param destDir 文件解壓后路徑
* @throws IOException
*/
public static void unzip(String zipFilePath, String destDir) throws IOException {
log.info("===>開啟文件解壓: {}",zipFilePath);
File dir = new File(destDir);
if (!dir.exists()) {
boolean mkdirs = dir.mkdirs();
if (!mkdirs) {
log.error("多級(jí)文件夾創(chuàng)建失敗===>{}",destDir);
}
}
//windows下中文默認(rèn)gbk 正常使用utf-8
try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath), StandardCharsets.UTF_8)) {
ZipEntry entry = zipIn.getNextEntry();
while (entry != null) {
String filePath = destDir + File.separator + entry.getName();
if (!entry.isDirectory()) {
extractFile(zipIn, filePath);
} else {
File dirToCreate = new File(filePath);
boolean mkdirs = dirToCreate.mkdirs();
if (!mkdirs) {
log.error("多級(jí)文件夾創(chuàng)建失敗===>{}",filePath);
}
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
}
}
/**
* 提取文件
* @param zipIn ZipInputStream
* @param filePath 文件路徑
* @throws IOException
*/
private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
try (FileOutputStream fos = new FileOutputStream(filePath)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = zipIn.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
}
}
}
2.4 圖片文件的壓縮
===> 傳送門: Thumbnails之上傳圖片后壓縮處理
2.5 oss文件后端上傳
===> 傳送門1: oss存儲(chǔ)對(duì)象 文件(視頻)上傳, 獲取回調(diào)中的url, 官網(wǎng)地址
===> 傳送門2: 后端oss存儲(chǔ)(完整版) 及 解決刪除本地文件顯示被占用問(wèn)題
2.6 oss文件前端上傳
===> 傳送門: oss前端文件上傳, 優(yōu)勢(shì)及后端如何配合
2.7 后端工具測(cè)試
? 傳送門: Postman,ApiPost, Idea httpclient tools,ApiFox 替代swagger,零侵入 接口文檔生成
3. 本文異??偨Y(jié)
3.1 異常總結(jié)
3.1.1 文件解壓的時(shí)候報(bào)錯(cuò)解決
java.lang.IllegalArgumentException: MALFORMED
解決方法
- 加charset(utf-8) 不行windows換gbk
3.1.2 讀取文件 報(bào) 無(wú)權(quán)限訪問(wèn)
兩種方法
- 增加文件夾權(quán)限
- 看看文件路徑
是否正確
找沒找到想讀取的文件
3.2 oss上傳異常
===> 傳送門: oss報(bào)錯(cuò)修改指南
4. 文章總結(jié)與預(yù)告
4.1 本文總結(jié)
注意文件夾路徑對(duì)應(yīng), 解壓文件路徑, 包括文件路徑斜線問(wèn)題
\\
和/
流用完記得關(guān)閉
判斷是否為空 避免空指針
4.2 下文預(yù)告
無(wú)預(yù)告, 終篇文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-732168.html
作者pingzhuyan 感謝觀看
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-732168.html
到了這里,關(guān)于(總目錄)springboot - 實(shí)現(xiàn)zip文件上傳并對(duì)zip文件解壓, 包含上傳oss的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!