Zip上传和解析的一些思考

需求:
批量导入商品的图片;图片是用Zip包的形式;
在这里插入图片描述

如下代码是上传Zip的业务代码,我们在别处调用的话直接去调用productBatchUploadManager.productBatchUploadQuickly(MultipartFile multipartFile)即可;

productUploadQuickly(MultipartFile multipartFile)方法中分好几步去执行上传解析Zip中的图片:

  1. uZipUtils.readZipContentByFileMutiFile(multipartFile)去解析Zip包,并将该包解析完成的内容放在服务器的某一个地方;
  2. checkBatchUpload()对解压完成的内容进行校验,因为你在校验完毕之前是不能对该内容进行上传或者数据库操作的,所以这一步必须进行业务操作之前进行校验;
  3. productBatchUpload();对解压完成的内容进行上传以及数据库操作;
  4. 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(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值