如何将base64编码图像上传到Amazon S3而无需使用官方PHP SDK临时保存在文件系统上?

问题描述:

我有一个使用名为html2canvas的JavaScript库的“截图”。它将“截图”作为base 64编码图像返回,然后通过AJAX传递给我的PHP服务器。然后,服务器将暂时将图像保存在文件系统中,将图像上传到Amazon S3,然后立即删除该文件。它可以工作,但我想看看是否可以直接上传图像而不保存到文件系统。如何将base64编码图像上传到Amazon S3而无需使用官方PHP SDK临时保存在文件系统上?

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

我注意到,有somebody asking similar question,但目前还没有回答这个问题,情况有点不同,因为我现在用的是official PHP SDKthe official service provider for laravel

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

+0

put_object需要一个文件处理程序。因此,您需要检查PHP代码中是否存在类似文件的I/O对象,或许您应该查看序列化库。 – mootmoot

跳过这一步,如果你的字符串是正确的输出,但如果你需要从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); 

您还可以选择添加图像头等,就像您上传文件一样。

+0

应该是'Body'=> $ pngData而不是?另外,对于base64编码的数据,图像的字符串可以通过简单的base64_decode获得? – cytsunny

+0

试试吧 - 你不会破坏任何东西:)但是,是的,是的(你拥有这一切)。为什么不同的变量: - 我抓住的片段来自不同的函数/类(即我有一个'AmazonS3Handler :: uploadString($ string)'方法,这就是为什么它是$ string,另一个snipeet是从$ jpgData区分我在另一个函数中使用,是的,'base64_decode()'。 – Robbie