【问题标题】:How to upload base64 encoded image to Amazon S3 without temporarily saving on file system with official PHP SDK?如何使用官方 PHP SDK 将 base64 编码图像上传到 Amazon S3 而不临时保存在文件系统上?
【发布时间】:2016-12-20 19:55:23
【问题描述】:

我有一个使用名为html2canvas 的javascript 库的div 的“屏幕截图”。它将“屏幕截图”作为 base 64 编码图像返回,然后我使用 AJAX 将其传递给我的 PHP 服务器。然后服务器将图像临时保存在文件系统中,将图像上传到 Amazon S3,然后立即删除文件。它可以工作,但我想看看是否可以直接上传图像而不保存到文件系统。

我知道有办法通过client side javascript直接上传图片,但我不想启用CORS。另外,我找到了a solution for Node.js,所以我想在 PHP 中也必须有一种方法。

我注意到有somebody asking similar question,但是这个问题没有答案,情况有点不同,因为我使用official PHP SDK和the official service provider for laravel

那么,有没有一种方法可以直接将 base64 编码的图像上传到 Amazon S3 而无需临时保存在文件系统上?

【问题讨论】:

  • put_object 需要一个文件处理程序。因此,您需要检查 php 代码以了解抛出类文件 I/O 对象的方法,也许您应该查看序列化库。

标签: php laravel amazon-web-services amazon-s3 laravel-5


【解决方案1】:

如果您的字符串是正确的输出,则跳过此步骤,但如果您需要从 GD 图像“保存”,则可以使用 ob 控件将图像保存到字符串:

ob_start();
imagepng($image);
$pngData = ob_get_clean();
ob_end_clean();

那么您可以简单地指定Body 直接上传字符串,而不是文件。

$aParams = [
    'Bucket'     => $bucketName,
    'Key'        => $destName,
    'Body'       => $string,
    'ACL'        => 'public-read'
]);
$result = $s3Client->putObject($aParams);

您还可以像上传文件一样选择添加图片标题等。

【讨论】:

  • 应该是 'Body' => $pngData 吗?另外,对于base64编码的数据,图片的字符串可以通过简单的base64_decode得到?
  • 试试吧 - 你不会破坏任何东西 :) 但是是的,是的,是的(你拥有一切)。为什么不同的变量:- 我抓取的 sn-ps 来自不同的函数/类(即我有一个 AmazonS3Handler::uploadString($string) 方法,这就是它是 $string 的原因,另一个 snipeet 是为了区别我在另一个函数中使用的 $jpgData . 是的,base64_decode().
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2018-06-30
  • 2013-10-20
相关资源
最近更新 更多