
本文旨在解决使用 cloudinary rest api 销毁图片时常见的签名生成问题。核心在于,api 请求的签名必须包含除 `file`、`cloud_name`、`resource_type` 和 `api_key` 之外的所有请求参数。这些参数需按字母顺序排列,并与 `api_secret` 拼接后进行 sha-1 哈希。掌握正确的签名生成方法是确保图片成功销毁的关键。
Cloudinary 作为一个强大的云媒体管理平台,提供了丰富的 API 接口,允许开发者对图片、视频等媒体资源进行上传、转换、管理和销毁。在使用其 REST API 执行敏感操作,例如销毁(destroy)图片时,为了确保请求的安全性与合法性,Cloudinary 强制要求对请求进行签名验证。正确的签名是 API 调用成功的关键,而签名生成不当则是导致操作失败的常见原因。本文将详细阐述 Cloudinary REST API 销毁图片时签名生成的正确方法,并提供完整的 PHP 代码示例。
Cloudinary 的 API 签名机制是其安全模型的核心组成部分。当您通过 REST API 发送请求时,除了 api_key 之外,还需要提供一个 signature 参数。这个签名是根据特定的请求参数和您的 api_secret 生成的,用于验证请求的真实性,防止未经授权的访问和数据篡改。
签名生成的基本规则:
许多开发者在使用 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 签名,关键在于识别所有需要签名的参数,并严格按照字母顺序进行排列。
以下是针对图片销毁操作(包含 public_id 和 invalidate 参数)的正确签名生成步骤:
在销毁图片的场景中,常见的待签名参数包括:
将这些参数及其值组合成键值对字符串,并按照参数名的字母顺序排列:
拼接后形成一个查询字符串形式的参数列表:
invalidate=true&public_id=folder/sample_public_id×tamp=1678886400
将上述排序好的参数字符串与您的 api_secret 拼接起来。
"invalidate=true&public_id=folder/sample_public_id×tamp=".$timestamp.$api_secret
最后,对拼接后的字符串进行 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")结合上述正确的签名生成方法,以下是一个使用 cURL 发送 Cloudinary 图片销毁请求的完整 PHP 示例:
<?php
// Cloudinary 凭据,请替换为您的实际信息
$api_key = "YOUR_API_KEY";
$api_secret = "YOUR_API_SECRET";
$cloud_name = "YOUR_CLOUD_NAME"; // 替换为您的 Cloudinary Cloud Name
// 要销毁的图片公共 ID,包含路径(如果存在)
$public_id_to_destroy = "folder/sample_public_id";
// 获取当前时间戳
$timestamp = time();
// 准备需要签名的参数
$params_to_sign = array(
'invalidate' => '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);
?>代码说明:
错误处理: 在生产环境中,务必对 curl_exec($ch) 的返回值进行严格检查,并利用 curl_errno($ch) 和 curl_error($ch) 获取详细的错误信息,以便及时发现并解决问题。Cloudinary API 也会在响应中提供错误详情。
invalidate 参数: 当 invalidate 设置为 true 时,Cloudinary 会尝试从其 CDN 缓存中清除被销毁的图片。这对于确保图片立即从所有分发点消失非常重要。
public_id 的准确性: 销毁操作要求 public_id 精确无误。如果图片位于某个文件夹中,public_id 必须包含完整的文件夹路径(例如 my_folder/my_image)。
API Secret 安全: 您的 api_secret 是敏感凭据,绝不能暴露在客户端代码或公共仓库中。应始终在服务器端进行 API 调用。
使用官方 SDK: Cloudinary 提供了多种语言的官方 SDK(如 PHP、Python、Node.js、J*a 等)。这些 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 交互并提高代码的健壮性。
以上就是Cloudinary REST API 图片销毁指南:正确生成请求签名的详细内容,更多请关注php中文网其它相关文章!
# python
# php
# 解决问题
# 设置为
# 顺序排列
# 您的
# unix
# ai
# curl
# ssl
# 编码
# composer
# node
# node.js
# js
# java
# 并与
# 外部图片 seo
# 日照抖音关键词排名优化
# 药品技术推广与营销论文
# 孝感爱采购seo排名
# 寻乌保安公司网络营销推广
# 在这里
# 是一个
# 移除
# 发点
# 怎么看
# 品牌企业网站建设服务
# 绍兴营销推广加盟店电话
# 新乡网站优化工程师
# 金昌网站营销推广
# 抖音快手短视频推广营销
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
知音漫客官网首页入口_知音漫客热门漫画推荐
嘀嗒顺风车如何开具电子发票
VBA Outlook邮件自动化:高效集成Excel数据与列标题的策略
苹果手机聊天记录删除了如何恢复
Mac怎么关闭按键声音_Mac键盘打字音效设置
iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】
汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口
PHP多语言网站的实现:会话管理与翻译函数优化教程
《广发易淘金》国债逆回购操作教程
蜻蜓FM如何设置移动流量播放
从J*a应用程序中导出MySQL表数据的技术指南
《tt语音》超级玩家开通方法
win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】
excel怎么制作考勤表 excel考勤模板与函数公式讲解
百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法
咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法
Animex动漫社正版在线入口 Animex动漫社动漫官方观看网
猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法
Python中深度嵌套字典与列表的数据提取与条件过滤指南
《画加》约稿流程
哔哩哔哩在线观看入口 B站官网免费进入
智慧职教mooc平台登录网址 智慧职教mooc官网直达
苹果手机手电筒无法开启
批改网网页版登录 批改网电脑版学生登录入口
虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画
使用VS Code调试Python代码:从入门到精通
虫虫助手如何更新游戏
在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享
mysql怎么查询数据_mysql基础查询语句使用教程
todesk如何添加信任设备_todesk信任设备设置教程
邦丰播放器频道搜索设置
优化2xN网格最大路径和的动态规划算法实践
解决PHP MySQL数据库更新无响应:SQL查询语法错误解析
BunnyStream TUS视频上传指南:解决401认证错误与参数配置
服装短视频如何起号推广?服装短视频起号推广有什么要求?
b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法
TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法
抖音视频如何添加标题?添加标题有哪些好处?
4399小游戏下装链接 4399小游戏下载链接入口
吃完饭就犯困是什么原因 餐后嗜睡如何缓解
多闪APP官方下载安装入口_多闪最新版本获取入口
mail.qq.com登录入口 QQ邮箱网页版直达
在J*a里什么是行为抽象_抽象行为对代码复用的提升作用
VS Code快捷键when上下文子句的妙用
创建快捷方式启动系统保护
智学网app怎么登录忘记密码_智学网app忘记密码找回与重新登录操作方法
《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局
使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程
抖音官网入口快速访问 抖音网页版账号注册解析
管理打开的编辑器:固定、分组和关闭技巧
2025-11-19
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。