主要步骤如下:
1. 如用户上传了缩略图,则将原有的缩略图删除(磁盘上删除),并更新tb_product表的img_addr字段,否则不做任何处理。
2. 如果用户上传了新的商品详情图片,则将原有的属于该productId下的全部的商品详情图删除(磁盘上删除),同时删除productId对应的tb_product_img中的全部数据。
3. 更新tb_product的信息
Service层新增两个接口
1 /** 2 * 通过商品Id查询唯一的商品信息 3 * @param productId 4 * @return 5 */ 6 Product getProductById(long productId); 7 8 /** 9 * 修改商品信息以及图片处理 10 * @param product 11 * @param thumbnail 12 * @param productImgHolderList 13 * @return 14 * @throws ProductOperationException 15 */ 16 ProductExecution modifyProduct(Product product,ImageHolder thumbnail,List<ImageHolder> productImgHolderList) 17 throws ProductOperationException;
实现类
1 @Override 2 public Product getProductById(long productId) { 3 return productDao.queryProductById(productId); 4 } 5 6 7 /** 8 * 注意事务控制@Transactional 9 */ 10 @Override 11 @Transactional 12 //1.若缩略图参数有值,则处理缩略图, 13 //若原先存在缩略图则先删除在添加新图,之后获取缩略图相对路径并赋值给product 14 //2.若商品详情图列表参数有值,对商品详情图片列表进行同样的操作 15 //3.将tb_product_img下面的该商品原来的商品详情图记录全部删除 16 //4.更新tb_product_img以及tb_product的信息 17 public ProductExecution modifyProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgHolderList) throws ProductOperationException { 18 //空值判断 19 if (product != null && product.getShop() != null && product.getShop().getShopId() != null && product.getProductCategory().getProductCategoryId() != null) { 20 // 设置默认的属性 21 product.setLastEditTime(new Date()); 22 23 // Step1. 处理缩略图 24 if (thumbnail != null) { 25 //先获取一遍原有信息,因为原来的信息里有原图片地址 26 Product tempProduct = productDao.queryProductById(product.getProductId()); 27 // 1.1 删除旧的缩略图 28 if (tempProduct.getImgAddr() != null) { 29 ImageUtil.deleteFileOrPath(tempProduct.getImgAddr()); 30 } 31 // 1.2 添加新的缩略图 32 addThumbnail(product, thumbnail); 33 } 34 35 // Step2. 处理商品详情 36 37 // 如果添加商品成功,继续处理商品详情图片,并写入tb_product_img 38 if (productImgHolderList != null && productImgHolderList.size() > 0) { 39 // 2.1 删除库表中productId对应的tb_product_img的信息 40 deleteProductImgList(product.getProductId()); 41 // 2.2 处理商品详情图片,并写入tb_product_img 42 addProductImgList(product, productImgHolderList); 43 } 44 try { 45 // Step3.更新tb_product 46 int effectNum = productDao.updateProduct(product); 47 if (effectNum <= 0) { 48 throw new ProductOperationException("商品更新失败"); 49 } 50 return new ProductExecution(ProductStateEnum.SUCCESS, product); 51 } catch (Exception e) { 52 throw new ProductOperationException("商品更新失败:" + e.getMessage()); 53 } 54 55 } else { 56 return new ProductExecution(ProductStateEnum.NULL_PRODUCT); 57 } 58 } 59 60 private void deleteProductImgList(long productId) { 61 // 获取该商铺下对应的productImg信息 62 List<ProductImg> productImgList = productImgDao.queryProductImgList(productId); 63 // 遍历删除该目录下的全部文件 64 for (ProductImg productImg : productImgList) { 65 ImageUtil.deleteFileOrPath(productImg.getImgAddr()); 66 } 67 // 删除tb_product_img中该productId对应的记录 68 productImgDao.deleteProductImgByProductId(productId); 69 70 }
问题: 发现不能删除磁盘上的文件
一看文件名都是有.JEPG 不对啊,传入的后缀名都是.jpg的
后来一看是ImageUtil里的getExtension在之前的字符串越界问题上在后面+1了改回来就可以了