繁体   English   中英

Cloudinary 图像上传不持久图像并在 spring 启动应用程序中返回 null 值

[英]Cloudinary image upload not persisting image and returning null value in spring boot app

我正在开发一个 spring 启动电子商务应用程序,它需要 cloudinary 来保存图像并使用 url。

然而,所有为实现这一目标所做的努力都被证明是徒劳的。 该代码没有抛出任何错误,但它不会持久存在于云端页面和数据库中。 响应是 null。

例如,这是一个响应。 同时我期待一个字符串形式的链接

{
  "productName": "Track suit",
  "price": 300,
  "productDescription": "XXL",
  "productImage1": "",
  "productImage2": "",
  "productImage3": ""
} 

这是我的代码

实体

@Entity
public class Product {

    @Id
    @GeneratedValue(generator="system-uuid")

    @GenericGenerator(name="system-uuid", strategy = "uuid")
    private String id;

    @Column
    private String productName;

    @Column
    private double price;

    @Column
    private String productDescription;

    @Column(nullable = false)
    private String productImage1;

    @Column(nullable = true)
    private String productImage2;

    @Column(nullable = true)
    private String productImage3;

    private LocalDateTime createdDate;

    private LocalDateTime updatedDate;

    @ManyToOne
    @JoinColumn(name = "admin_id")
    private Admin admin;

    @ManyToOne
    @JoinColumn(name = "category_id")
    private Category category;

    @ManyToOne
    @JoinColumn(name = "users_entity_id")
    private UsersEntity usersEntity;
}

请求DTO

@Data

public class UploadProductRequestDto {
    private String productName;
    private double price;
    private String productDescription;
    private MultipartFile productImage1;
    private MultipartFile productImage2;
    private MultipartFile productImage3;
}

响应 DTO

@Data
public class UploadProductResponseDto {

    private String productName;
    private double price;
    private String productDescription;
    private String productImage1;
    private String productImage2;
    private String productImage3;

}

资料库

public interface ProductRepository extends JpaRepository<Product,String> {
    Optional<Product> findByProductName(String productName);
}

服务

public interface ProductService {
 UploadProductResponseDto uploadProducts(UploadProductRequestDto uploadProductRequestDto, String categoryName) throws AuthorizationException, GeneralServiceException, ImageUploadException;
}

服务实施

@Slf4j
@Service

public class ProductServiceImpl implements ProductService {

    @Autowired
    CloudStorageService cloudStorageService;

    @Autowired
    AdminRepository adminRepository;

    @Autowired
    CategoryRepository categoryRepository;

    @Autowired
    PasswordEncoder passwordEncoder;

    @Autowired
    ModelMapper modelMapper;

    @Autowired
    UserPrincipalService userPrincipalService;

    @Autowired
    UserRepository userRepository;

    @Autowired
    ProductRepository productRepository;

    @Override
    public UploadProductResponseDto uploadProducts(UploadProductRequestDto uploadProductRequestDto, StringcategoryName) throws AuthorizationException, GeneralServiceException, ImageUploadException {

        Optional<Category> checkCategory = categoryRepository.findByCategoryName(categoryName);
        if (checkCategory.isEmpty()){
            throw new AuthorizationException(CATEGORY_NOT_RECOGNIZED);
        }

        Product product = new Product();
        product=mapAdminRequestDtoToProduct(uploadProductRequestDto,product);
        productRepository.save(product);
        UploadProductResponseDto adminUploadProductResponseDto = packageAdminProductUploadResponseDTO(product);
        return adminUploadProductResponseDto;
    }

    private UploadProductResponseDto packageAdminProductUploadResponseDTO(Product product){
        UploadProductResponseDto uploadProductResponseDto=new UploadProductResponseDto();
        modelMapper.map(product,uploadProductResponseDto);
        return uploadProductResponseDto;

    }

    private Product mapAdminRequestDtoToProduct(UploadProductRequestDto uploadProductRequestDto,Product product) throws ImageUploadException {

        modelMapper.map(uploadProductRequestDto,product);
        product=uploadProductImagesToCloudinaryAndSaveUrl(uploadProductRequestDto,product);
        product.setId("Product "+ IdGenerator.generateId());
        return product;

    }


    private Product uploadProductImagesToCloudinaryAndSaveUrl(UploadProductRequestDto uploadProductRequestDto,Product product) throws ImageUploadException {
       product.setProductImage1(imageUrlFromCloudinary(uploadProductRequestDto.getProductImage1()));
       product.setProductImage2(imageUrlFromCloudinary(uploadProductRequestDto.getProductImage2()));
       product.setProductImage3(imageUrlFromCloudinary(uploadProductRequestDto.getProductImage3()));

       return product;
    }


    private String imageUrlFromCloudinary(MultipartFile image) throws ImageUploadException {

        String imageUrl="";

        if(image!=null && !image.isEmpty()){
            Map<Object,Object> params=new HashMap<>();
            params.put("public_id","E&L/"+extractFileName(image.getName()));
            params.put("overwrite",true);
            try{
                Map<?,?> uploadResult = cloudStorageService.uploadImage(image,params);
                imageUrl= String.valueOf(uploadResult.get("url"));
            }catch (IOException e){
                e.printStackTrace();
                throw new ImageUploadException("Error uploading images,vehicle upload failed");
            }
        }
        return imageUrl;
    }

    private String extractFileName(String fileName){
        return fileName.split("\\.")[0];
    }
}

Controller

@Slf4j
@RestController
@RequestMapping(ApiRoutes.ENMASSE)
public class ProductController {

    @Autowired
    ProductService productService;

    @PostMapping("/upload-product/categoryName")
    public ResponseEntity<?> UploadProduct(@ModelAttribute UploadProductRequestDto UploadProductRequestDto,@RequestParam String categoryName){

        try{
            return new ResponseEntity<>
(productService.uploadProducts(UploadProductRequestDto,categoryName), HttpStatus.OK);
        }catch (Exception exception){
            return new ResponseEntity<>(exception.getMessage(),HttpStatus.BAD_REQUEST);
        }
    }
}

云配置

@Component
@Data

 public class CloudinaryConfig {

 @Value("${CLOUD_NAME}")
 private String cloudName;

 @Value("${API_KEY}")
 private String apikey;

 @Value("${API_SECRET}")
 private String secretKey;

}

云配置

@Component

public class CloudinaryConfiguration {

@Autowired
CloudinaryConfig cloudinaryConfig;

@Bean
public Cloudinary getCloudinaryConfig(){
    return new Cloudinary(ObjectUtils.asMap("cloud_name",cloudinaryConfig.getCloudName(),
            "api_key",cloudinaryConfig.getApikey(),"api_secret",cloudinaryConfig.getSecretKey()));
}

}

CloudinaryStorageServiceImpl

 @Service

 public class CloudinaryStorageServiceImpl implements CloudStorageService{

@Autowired
Cloudinary cloudinary;

@Override

public Map<?, ?> uploadImage(File file, Map<?, ?> imageProperties) throws IOException {
    return cloudinary.uploader().upload(file,imageProperties);
}

@Override

public Map<?, ?> uploadImage(MultipartFile multipartFile, Map<?, ?> imageProperties) throws IOException {
    return cloudinary.uploader().upload(multipartFile.getBytes(),imageProperties);
}
}

云存储服务

public interface CloudStorageService {

Map<?,?> uploadImage(File file, Map<?,?> imageProperties) throws IOException;

Map<?,?> uploadImage(MultipartFile multipartFile, Map<?, ?> imageProperties) throws IOException;
}
  1. 您没有在此处粘贴的代码中包含 cloudStorageService.uploadImage(?,?) 的实现。
  2. Cloudinary 的 Java 实现要求您以字节为单位传入多部分文件。 我不知道你是否有,因为你的上传方法不在这里。

可能参考这里的简单实现

PS:你可以clone repo看看CloudinaryServiceImpl中upload方法的实现。

碰巧我的代码没有问题。 问题是它必须与前端耦合,以便图像标签可以呈现它。 谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM