我现在所做的是创建一个二维码图像(PNG),并将其副本保存在服务器根目录的文件夹中。现在我不想把这个图片保存在我的服务器上,而是保存在亚马逊的存储桶上。
我知道如何在亚马逊上保存文件,但我不知道如何协同工作。这是我将其保存在服务器上的根文件夹中的原始代码:
$fileName = $quiz_url . '.png';
$pngAbsoluteFilePath = APPLICATION_PATH . '/../public/qrcodecaches/' . $fileName;
$urlRelativeFilePath = '/qrcodecaches/' . $fileName;
// generating
if (!file_exists($pngAbsoluteFilePath)) {
QRcode::png('http://mysitelink.com/s/'.$quiz_url, $pngAbsoluteFilePath, 'L', 4, 2);
}
这就是我在亚马逊上保存文件的方式:
$bucket = 'mybucket';
$map = 'qrcodecaches';
$client = S3Client::factory(array(
'key' => 'mykey',
'secret' => 'mysecret',
));
$fileName = $quiz_url . '.png';
$keyname = $map . '/' . $fileName;
try {
$client->putObject(array(
'Bucket' => $bucket,
'Key' => $keyname,
'Body' => fopen('/path/to/file', 'r'),
'ACL' => 'public-read',
));
} catch (S3Exception $e) {
echo "There was an error uploading the file.'n";
}
但是我需要在"Body"标签中保存什么?有人能帮我吗?
您可以创建一个传递临时文件名的图像文件,如下所示:
$pngAbsoluteFilePath = tempnam(sys_get_temp_dir(), 'qr_code_');
if (!file_exists($pngAbsoluteFilePath)) {
QRcode::png('http://mysitelink.com/s/'.$quiz_url, $pngAbsoluteFilePath, 'L', 4, 2);
}
那么您所需要做的就是获取文件内容,并将其传递到bucket:中对象的Body
try {
$client->putObject(array(
'Bucket' => $bucket,
'Key' => $keyname,
'Body' => file_get_contents($pngAbsoluteFilePath), // like this
'ACL' => 'public-read'
));
}
catch (S3Exception $e) {
echo "There was an error uploading the file.'n";
}
完成后,如果上传成功,您可以删除临时文件。但建议不要这样做,因为在服务器重新启动之前,它会用QR图像填充/tmp
:
if ( empty($e) ) {
unlink($pngAbsoluteFilePath);
}
这对我来说效果很好。
AmazonS3Client文档建议您可以轮询以检查上传是否成功。
$client->waitUntilObjectExists(array(
'Bucket' => $bucket,
'Key' => $keyname
));
或者,如果您已经将文件写入服务器上的磁盘,则可以向S3Client提供该文件的路径,并让它自己处理文件流。
try {
$client->putObject(array(
'Bucket' => $bucket,
'Key' => $keyname,
'SourceFile' => '/path/to/file',
'ACL' => 'public-read'
));
} catch (S3Exception $e) {
echo "There was an error uploading the file.'n";
}
来源:http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.S3Client.html#_putObject