需求:
批量导入商品的图片;图片是用Zip包的形式;
如下代码是上传Zip的业务代码,我们在别处调用的话直接去调用productBatchUploadManager.productBatchUploadQuickly(MultipartFile multipartFile)
即可;
productUploadQuickly(MultipartFile multipartFile)
方法中分好几步去执行上传解析Zip中的图片:
uZipUtils.readZipContentByFileMutiFile(multipartFile)
去解析Zip包,并将该包解析完成的内容放在服务器的某一个地方;checkBatchUpload()
对解压完成的内容进行校验,因为你在校验完毕之前是不能对该内容进行上传或者数据库操作的,所以这一步必须进行业务操作之前进行校验;productBatchUpload();
对解压完成的内容进行上传以及数据库操作;deleteBatchUpload(UZipUtils.OUT_PUT_DIRECTORY);
删除在解析完成后存放在服务器的临时文件
当然在有一定的并发的情况下,会存在线程1在执行checkBatchUpload
,线程2在执行deleteBatchUpload
,这样就会出现问题,我们可以在productUploadQuickly
方法上加上synchronized,确保只有一个线程去执行该代码;
/**
* @Author:朱国庆
* @Date:2020/7/29 10:33
* @Desription: qidian-server-distribution
* @Version: 1.0
*/
@Service
public class ProductBatchUploadManagerImpl implements ProductBatchUploadManager {
@Autowired
private UZipUtils uZipUtils;
@Autowired
private UploadHandler uploadHandler;
@Autowired
private ProductDomainMapper productDomainMapper;
@Autowired
private GoodsApiMapper goodsApiMapper;
@Override
public void checkBatchUpload() {
File file = new File(UZipUtils.OUT_PUT_DIRECTORY);
File[] fileDirectories = file.listFiles();
for (File fileDirectory : fileDirectories) {
if (fileDirectory.isDirectory()) {
String spuName = fileDirectory.getName();
//对名称进行切割.将文件名做为spuId
//spuName = spuName.substring(0, spuName.lastIndexOf("/"));
Long spuNameId;
try {
spuNameId = Long.parseLong(spuName);
} catch (NumberFormatException e) {
throw new RuntimeException(spuName + "文件夹名称格式不合法,必须是spuId");
}
//去数据库中查询,如果spuId不存在,那么就抛出异常
ProdSpuDO prodSpuDO = productDomainMapper.queryProdSpuDOById(spuNameId);
if (Objects.isNull(prodSpuDO)) {
throw new RuntimeException(spuName + "文件夹找不到对应的商品spu");
}
File[] files = fileDirectory.listFiles();
//该集合用来收集主图
ArrayList<File> fileMain = new ArrayList<>();
for (File fileToOSS : files) {
//过滤掉隐藏文件
if (fileToOSS.getName().startsWith(".")) {
continue;
}
if (fileToOSS.isFile()) {
String name = fileToOSS.getName();
//String spuNameTemp = name.substring(0, name.lastIndexOf("/"));
//对切割完的数据将后缀名去掉
String spuFileName = name.substring(