为啥我在 Cloudinary Java 上收到“无效签名”错误?

Posted

技术标签:

【中文标题】为啥我在 Cloudinary Java 上收到“无效签名”错误?【英文标题】:Why am I getting an 'Invalid Signature' error on Cloudinary Java?为什么我在 Cloudinary Java 上收到“无效签名”错误? 【发布时间】:2019-01-15 15:57:40 【问题描述】:

我正在尝试在 JSF 应用程序中实现 Cloudinary 上传。根据 Cloudinary 网站上的说明,我正在使用此依赖项:

<dependency>
    <groupId>com.cloudinary</groupId>
    <artifactId>cloudinary-http44</artifactId>
    <version>1.19.0</version>
</dependency>

我有一个用于上传的课程:

package com.github.cvetan.bookstore.util;

import com.cloudinary.*;
import com.cloudinary.utils.ObjectUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author cvetan
 */
public class CloudinaryFacade 

    private final static Map<Object, Object> CONFIG = new HashMap<>();

    static 
        CONFIG.put("cloud_name", "cvetan");
        CONFIG.put("api_key", "***");
        CONFIG.put("api_secret", "***");
    

    public static String upload(byte[] file) throws IOException 
        Cloudinary cloudinary = new Cloudinary(CONFIG);

        Map result = cloudinary.uploader().upload(file, ObjectUtils.emptyMap());

        return (String) result.get("url");
    

但是当我尝试它时,会抛出下面的异常:

Invalid Signature 6e527a754f1f6fd84df0bd4c092df881c0ddc65f. String to sign - 'timestamp=1533653472'.

任何帮助将不胜感激。谢谢。

【问题讨论】:

那么,如果你在单元测试中这样做,它会起作用吗? 我不确定我是否理解你。我没有写任何测试。 :) 那么请做。它有助于查看它是否与 JSF 相关......(99.9% 确定它不是)。 是的,你可能是对的。我添加了 jsf 标记,因为我正在处理 JSF 应用程序,但这与此无关。我将删除 JSF 标记。 【参考方案1】:

我建议您使用简单的服务器端 Java 应用程序检查您上传到 Cloudinary 的内容。像这样的东西:-

import com.cloudinary.*;
import com.cloudinary.utils.ObjectUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CloudinaryFacade 
  private final static Map<Object, Object> CONFIG = new HashMap<>();

    static 
        CONFIG.put("cloud_name", "");
        CONFIG.put("api_key", "");
        CONFIG.put("api_secret", "");
    

  public static void main(String[] args) throws IOException 
       Cloudinary cloudinary = new Cloudinary(CONFIG);

        Map result = cloudinary.uploader().upload("https://res.cloudinary.com/demo/image/upload/sample.jpg", ObjectUtils.emptyMap());

        System.out.println(result);



上述示例运行后,您可以继续测试字节上传。这将确保您没有配置问题。

这是一个例子。我正在使用 apache 文件上传:

List<FileItem> formItems = upload.parseRequest(request);//List of file items
for (FileItem item : formItems) 
    String fileName = item.getName();
    //save on Cloudinary
    Map imageUpload=cloudinary.uploader().upload(item.get(), 
    ObjectUtils.asMap("public_id",fileName));

【讨论】:

它不认为这是配置错误,因为我收到另一个错误,当我输入错误的 api 密钥时。但我设法用你的例子上传了它。而且我也不认为它与字节数组上传有关,因为我遇到了一些时间戳错误,当我尝试从磁盘上的路径上传文件时,我得到了同样的结果。那么 Web 应用程序可能会出现什么问题?【参考方案2】:

我已经设法让它工作了。我最终将上传的文件内容从 PrimeFaces uploadedFile 复制到一个临时文件中,并将该文件发送到 Cloudinary 上传。

托管 bean 类方法(上传处理程序):

public String upload() 
        try 
            File uploadedFile = File.createTempFile("image", ".tmp");

            InputStream content = file.getInputstream();

            Files.copy(content, uploadedFile.toPath(), StandardCopyOption.REPLACE_EXISTING);

            String filename = CloudinaryFacade.upload(uploadedFile);

            return Redirector.redirectWithMessage(filename, FacesMessage.SEVERITY_INFO, null);
         catch (IOException ex) 
            return Redirector.redirectWithMessage(ex.getMessage(), FacesMessage.SEVERITY_ERROR, null);
        
    

云端上传方式:

public static String upload(File file) throws IOException 
        Cloudinary cloudinary = new Cloudinary(CONFIG);
        Map<Object, Object> parameters = new HashMap<>();
        parameters.put("public_id", "Bookstore/Authors/Images/vejder");

        Map result = cloudinary.uploader().upload(file, parameters);

        return (String) result.get("url");
    

谢谢。

【讨论】:

以上是关于为啥我在 Cloudinary Java 上收到“无效签名”错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 JavaFX 上收到 java.lang.IllegalStateException“不在 FX 应用程序线程上”?

尝试上传到 Cloudinary 时收到令人困惑的错误

为啥我在部署应用程序时收到 java.net.SocketException: Connection reset?

Java 聊天室 - 为啥我收到 SocketException?

为啥我在 ProcessBuilder --Java 中收到 IllegalThreadStateException 错误?

为啥我在代码中的线程“main”java.lang.StringIndexOutOfBoundsException 错误中收到异常?