如何使用 laravel jrm2k6/cloudder 将图像上传到 cloudiary 上的特定文件夹

Posted

技术标签:

【中文标题】如何使用 laravel jrm2k6/cloudder 将图像上传到 cloudiary 上的特定文件夹【英文标题】:How to upload an image to a specific folder on cloudiary with laravel jrm2k6/cloudder 【发布时间】:2020-02-16 14:19:14 【问题描述】:

我想裁剪头像图像并使用 Laravel jrm2k6/cloudder 将其上传到 cloudiary 的特定文件夹,但上传图像时遇到错误。 谁能帮我解决问题或说明如何解决?

以下是存储在日志文件中的错误消息。

[2019-10-20 10:39:38] local.ERROR: Invalid Signature 22800853dcbe6c9972b65d99946460f1965a6e06. String to sign - 'folder=media/users/1/avatar&timestamp=
1571535576'. "userId":1,"exception":"[object] (Cloudinary\\Error(code: 401): Invalid Signature 22800853dcbe6c9972b65d99946460f1965a6e06. String to sig
n - 'folder=media/users/1/avatar&timestamp=1571535576'. at /Users/kondonator/Development/tiny-services/vendor/cloudinary/cloudinary_php/src/Uploader.ph
p:515)
[stacktrace]
#0 /Users/kondonator/Development/tiny-services/vendor/cloudinary/cloudinary_php/src/Uploader.php(374): Cloudinary\\Uploader::call_api('upload', Array,
Array, '/private/var/tm...')
#1 /Users/kondonator/Development/tiny-services/vendor/cloudinary/cloudinary_php/src/Uploader.php(99): Cloudinary\\Uploader::call_cacheable_api('upload'
, Array, Array, '/private/var/tm...')
#2 /Users/kondonator/Development/tiny-services/vendor/jrm2k6/cloudder/src/JD/Cloudder/CloudinaryWrapper.php(122): Cloudinary\\Uploader::upload('/privat
e/var/tm...', Array)
#3 /Users/kondonator/Development/tiny-services/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(239): JD\\Cloudder\\CloudinaryWrapper
->upload('/private/var/tm...', NULL, Array, Array)
#4 /Users/kondonator/Development/tiny-services/app/Http/Controllers/UserController.php(150): Illuminate\\Support\\Facades\\Facade::__callStatic('upload
', Array)
#5 [internal function]: App\\Http\\Controllers\\UserController->update(Object(Illuminate\\Http\\Request), '1')

下面是UserController.php的代码

  $path = $request->file('avatar')
                  ->getRealPath();

  $image = Image::make($path);

  $image->crop($request->width, $request->height, $request->x, $request->y)
        ->resize(200, 200)
        ->save();

  $folder = 'media/users/'.$id.'/avatar';

  Cloudder::upload($path, null, ['folder' => $folder], []);

  $result = Cloudder::getResult();

  $avatar = Cloudder::getPublicId();

最后是 .env 的一部分,来自 Cloudinary 的仪表板 -> 帐户详细信息。

CLOUDINARY_API_KEY=XXXXX
CLOUDINARY_API_SECRET=YYYYY
CLOUDINARY_CLOUD_NAME=ZZZZZ

提前致谢。

【问题讨论】:

【参考方案1】:

api_secret 之前的字符串 (folder=media/users/1/avatar&timestamp=1571535576) 在末尾连接是正确的,但它应该产生的签名是 083dc25c1d1e4a90f84336450f21c9fb59b343f5

我建议仔细检查您的配置 (.env) 中的 CLOUDINARY_API_SECRET,如果您对其进行了任何更改,那么您应该重新启动服务器以使其生效。

您还可以在命令行上手动生成正确的签名,以仔细检查作为异常的一部分抛出的签名。在以下命令中将<API_SECRET> 替换为您的实际值:

echo -n "folder=media/users/1/avatar&timestamp=1571535576<API_SECRET>" | sha1sum

另外,与错误无关,但我建议您在配置中保持您的云名称全部小写。 API 响应将返回 urlsecure_url 全部小写,使用媒体库生成的 URL 也是如此。请求不同大小写的资源会导致 CDN 上的缓存键不同。

【讨论】:

根据您的反馈,我执行了以下操作,但仍然无法解决问题。首先,我仔细检查了 .env 中的行,发现它们是正确的。其次,我在MacOS上根据您的公式自己计算了签名。结果,浏览器显示的签名与我在 MacOS 上计算的签名不同。我还尝试了一些算法,如 1(默认)、224、256、384、512、512224、512256,但从不相同。第三,我忘了提到laravel的版本。现在是 6.3.0。你有什么额外的建议吗?再次提前致谢。 我建议同时检查系统的环境变量,以防有一个名为 CLOUDINARY_URL 或任何其他 CLOUDINARY_ 的变量会覆盖配置中设置的任何其他凭据。另外,我建议添加一些调试代码来打印出 Cloudinary\HttpClient 的 api_sign_request( ) 方法中正在签名的值;这将告诉您正在签名的字符串(包括 API 机密)的实际值,并有助于缩小范围。 我一次又一次地修改了代码,终于成功了。代码如下:`Cloudder::upload($path, null, ['folder' => $folder, 'overwrite' => TRUE, 'resource_type' => 'image']);`。感谢您的建议。

以上是关于如何使用 laravel jrm2k6/cloudder 将图像上传到 cloudiary 上的特定文件夹的主要内容,如果未能解决你的问题,请参考以下文章

6.Spring-cloud官方构建图

如何使用laravel保存所有行数据每个行名或相等

如何使用 Laravel Facades

如何在 Laravel 8 中使用 srmklive/laravel-paypal v3

如何开始使用Laravel

如何在 Laravel 外部的包中使用 Laravel 外观(缓存、日志、存储)