0

0

Cloudinary REST API 图片销毁指南:正确生成请求签名

花韻仙語

花韻仙語

发布时间:2025-11-19 09:52:08

|

840人浏览过

|

来源于php中文网

原创

Cloudinary REST API 图片销毁指南:正确生成请求签名

本文旨在解决使用 cloudinary rest api 销毁图片时常见的签名生成问题。核心在于,api 请求的签名必须包含除 `file`、`cloud_name`、`resource_type` 和 `api_key` 之外的所有请求参数。这些参数需按字母顺序排列,并与 `api_secret` 拼接后进行 sha-1 哈希。掌握正确的签名生成方法是确保图片成功销毁的关键。

引言:Cloudinary REST API 图片销毁概览

Cloudinary 作为一个强大的云媒体管理平台,提供了丰富的 API 接口,允许开发者对图片、视频等媒体资源进行上传、转换、管理和销毁。在使用其 REST API 执行敏感操作,例如销毁(destroy)图片时,为了确保请求的安全性与合法性,Cloudinary 强制要求对请求进行签名验证。正确的签名是 API 调用成功的关键,而签名生成不当则是导致操作失败的常见原因。本文将详细阐述 Cloudinary REST API 销毁图片时签名生成的正确方法,并提供完整的 PHP 代码示例。

理解 Cloudinary API 签名机制

Cloudinary 的 API 签名机制是其安全模型的核心组成部分。当您通过 REST API 发送请求时,除了 api_key 之外,还需要提供一个 signature 参数。这个签名是根据特定的请求参数和您的 api_secret 生成的,用于验证请求的真实性,防止未经授权的访问和数据篡改。

签名生成的基本规则:

  1. 包含所有相关参数: 除了 file、cloud_name、resource_type 和 api_key 之外,所有作为请求一部分发送的参数都必须包含在用于生成签名的字符串中。
  2. 参数按字母顺序排列: 在构造用于签名的字符串时,所有待签名的参数(及其值)必须按照参数名的字母顺序进行排列。
  3. 拼接 api_secret: 排列好的参数字符串需要与您的 api_secret 进行拼接。
  4. 进行 SHA-1 哈希: 最后,对拼接后的完整字符串进行 SHA-1 哈希运算,生成最终的 signature。

常见错误:签名参数遗漏

许多开发者在使用 Cloudinary REST API 时,可能会遇到图片销毁失败的问题,且 API 返回结果为空或报错。这通常是由于签名生成过程中遗漏了部分请求参数所致。

例如,在尝试销毁图片时,如果请求中包含了 public_id、timestamp 和 invalidate 等参数,但签名生成时只考虑了 timestamp,那么 Cloudinary 服务器在验证签名时就会发现不匹配,从而拒绝该请求。

错误的签名生成示例(仅签名 timestamp):

// 假设 $public_id 和 $invalidate 也在请求中发送
$signature = sha1("timestamp=".$timestamp.$api_secret); 
// 错误:遗漏了 public_id 和 invalidate 参数

这种情况下,尽管 api_key 和 timestamp 都正确,但由于 public_id 和 invalidate 未被纳入签名计算,导致服务器认为签名无效。

正确生成 Cloudinary API 签名

要正确生成 Cloudinary API 签名,关键在于识别所有需要签名的参数,并严格按照字母顺序进行排列。

以下是针对图片销毁操作(包含 public_id 和 invalidate 参数)的正确签名生成步骤:

步骤一:识别待签名参数

在销毁图片的场景中,常见的待签名参数包括:

  • public_id:要销毁的图片的公共 ID。
  • timestamp:请求的时间戳。
  • invalidate:一个布尔值,指示是否从 CDN 缓存中清除该图片(通常设置为 true)。

步骤二:参数按字母顺序排列

将这些参数及其值组合成键值对字符串,并按照参数名的字母顺序排列:

  1. invalidate=true
  2. public_id=folder/sample_public_id (请替换为实际的公共 ID)
  3. timestamp=1678886400 (请替换为实际的时间戳)

拼接后形成一个查询字符串形式的参数列表:

invalidate=true&public_id=folder/sample_public_id×tamp=1678886400

步骤三:拼接参数与 api_secret

将上述排序好的参数字符串与您的 api_secret 拼接起来。

"invalidate=true&public_id=folder/sample_public_id×tamp=".$timestamp.$api_secret

步骤四:进行 SHA-1 哈希

最后,对拼接后的字符串进行 SHA-1 哈希运算,得到最终的 signature。

修正后的 PHP 签名代码示例:

$api_key = "YOUR_API_KEY"; // 替换为您的 Cloudinary API Key
$api_secret = "YOUR_API_SECRET"; // 替换为您的 Cloudinary API Secret
$cloud_name = "YOUR_CLOUD_NAME"; // 替换为您的 Cloudinary Cloud Name

$public_id_to_destroy = "folder/sample_public_id"; // 替换为要销毁的图片公共 ID
$timestamp = time(); // 当前时间戳

// 注意:这里需要将所有参与 POST 请求的参数(除了api_key, resource_type, cloud_name, file)都纳入签名
// 且参数需要按字母顺序排列
$params_to_sign = array(
    'invalidate' => 'true', // 注意:布尔值在签名时通常以字符串形式出现
    'public_id' => $public_id_to_destroy,
    'timestamp' => $timestamp
);

// 对参数进行字母排序
ksort($params_to_sign);

// 拼接参数字符串
$signature_string = '';
foreach ($params_to_sign as $key => $value) {
    $signature_string .= $key . '=' . $value . '&';
}
// 移除最后一个 '&'
$signature_string = rtrim($signature_string, '&');

// 拼接 api_secret 并进行 SHA-1 哈希
$signature = sha1($signature_string . $api_secret);

// 最终的签名字符串将类似于: sha1("invalidate=true&public_id=folder/sample_public_id×tamp=1678886400YOUR_API_SECRET")

完整的 PHP 图片销毁示例

结合上述正确的签名生成方法,以下是一个使用 cURL 发送 Cloudinary 图片销毁请求的完整 PHP 示例:

 'true', // 销毁后从 CDN 缓存中清除
    'public_id' => $public_id_to_destroy,
    'timestamp' => $timestamp
);

// 对参数进行字母排序
ksort($params_to_sign);

// 拼接参数字符串
$signature_string = '';
foreach ($params_to_sign as $key => $value) {
    $signature_string .= $key . '=' . $value . '&';
}
$signature_string = rtrim($signature_string, '&'); // 移除末尾的 '&'

// 生成签名
$signature = sha1($signature_string . $api_secret);

// 准备 POST 请求的数据
$postRequest = array(
    'public_id' => $public_id_to_destroy,
    'timestamp' => $timestamp,
    'api_key' => $api_key,
    'signature' => $signature,
    'resource_type' => 'image', // 指定资源类型为图片
    'invalidate' => true // 销毁后从 CDN 缓存中清除
);

// 初始化 cURL
$ch = curl_init();

// 设置 cURL 请求 URL
curl_setopt($ch, CURLOPT_URL, "https://api.cloudinary.com/v1_1/{$cloud_name}/image/destroy");
// 设置为 POST 请求
curl_setopt($ch, CURLOPT_POST, 1);
// 设置 POST 请求体
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postRequest));
// 如果 HTTP 状态码表示错误,则返回 FALSE
curl_setopt($ch, CURLOPT_FAILONERROR, true);
// 允许 cURL 跟踪重定向
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 开启详细输出(用于调试)
// curl_setopt($ch, CURLOPT_VERBOSE, true); 
// 将服务器响应作为字符串返回,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 禁用 SSL 主机验证和对等验证(生产环境不推荐,仅用于测试)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 设置连接超时和请求超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);

// 执行 cURL 请求
$response = curl_exec($ch);

// 检查是否有 cURL 错误
if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    // 打印服务器响应
    print_r($response);
}

// 关闭 cURL 资源
curl_close($ch);

?>

代码说明:

  • $cloud_name:您的 Cloudinary 云名称。
  • $public_id_to_destroy:您希望销毁的图片的公共 ID。请确保该 ID 包含任何文件夹路径(例如 folder/sample_public_id)。
  • $timestamp:使用 time() 函数获取当前 Unix 时间戳。
  • $params_to_sign 数组:包含了所有需要签名的参数。注意 invalidate 的值在这里是字符串 'true',以确保与 Cloudinary 签名规则一致。
  • ksort($params_to_sign):对数组进行键名排序,确保参数按字母顺序排列。
  • http_build_query($postRequest):将关联数组转换为 URL 编码的查询字符串,作为 POST 请求体发送。
  • CURLOPT_FAILONERROR 和 CURLOPT_RETURNTRANSFER:这两个选项对于捕获 API 错误和处理响应至关重要。

注意事项与最佳实践

  1. 错误处理: 在生产环境中,务必对 curl_exec($ch) 的返回值进行严格检查,并利用 curl_errno($ch) 和 curl_error($ch) 获取详细的错误信息,以便及时发现并解决问题。Cloudinary API 也会在响应中提供错误详情。

  2. invalidate 参数: 当 invalidate 设置为 true 时,Cloudinary 会尝试从其 CDN 缓存中清除被销毁的图片。这对于确保图片立即从所有分发点消失非常重要。

  3. public_id 的准确性: 销毁操作要求 public_id 精确无误。如果图片位于某个文件夹中,public_id 必须包含完整的文件夹路径(例如 my_folder/my_image)。

  4. API Secret 安全: 您的 api_secret 是敏感凭据,绝不能暴露在客户端代码或公共仓库中。应始终在服务器端进行 API 调用。

  5. 使用官方 SDK: Cloudinary 提供了多种语言的官方 SDK(如 PHP、Python、Node.js、Java 等)。这些 SDK 通常会自动处理签名生成、错误处理和各种 API 调用的复杂性,强烈建议在实际项目中优先使用 SDK,以简化开发并减少出错的可能性。例如,使用 Cloudinary PHP SDK 销毁图片的代码会更简洁:

    require 'vendor/autoload.php'; // 如果使用 Composer
    use Cloudinary\Cloudinary;
    use Cloudinary\Configuration\Configuration;
    
    Configuration::instance([
        'cloud_name' => 'YOUR_CLOUD_NAME',
        'api_key' => 'YOUR_API_KEY',
        'api_secret' => 'YOUR_API_SECRET'
    ]);
    
    $cloudinary = new Cloudinary();
    try {
        $result = $cloudinary->upload_api()->destroy('folder/sample_public_id', ['resource_type' => 'image', 'invalidate' => true]);
        print_r($result);
    } catch (Exception $e) {
        echo 'Error: ' . $e->getMessage();
    }

总结

正确生成 Cloudinary REST API 请求的签名是确保图片销毁操作成功的关键。核心在于理解签名机制,即除了少数特定参数外,所有请求参数都必须按字母顺序排列并与 api_secret 一同进行 SHA-1 哈希。通过遵循本文提供的指南和代码示例,您可以有效地解决签名问题,并可靠地管理 Cloudinary 上的媒体资源。在实际开发中,推荐使用 Cloudinary 官方 SDK 来简化 API 交互并提高代码的健壮性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

440

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

177

2023.10.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1500

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

623

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

613

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

588

2024.04.29

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号