我对如何使用Laravel 4从Amazon S3下载文件有点确定。我正在使用AWS
$result = $s3->getObject(array(
'Bucket' => $bucket,
'Key' => 'data.txt',
));
// temp file
$file = tempnam('../uploads', 'download_');
file_put_contents($file, $result['Body']);
$response = Response::download($file, 'test-file.txt');
//unlink($file);
return $response;
以上工作,但我坚持在本地保存文件。如何使用Response::download()
正确使用S3的结果?
谢谢!
编辑:我发现我可以使用$s3->getObjectUrl($bucket, $file, $expiration)
来生成访问网址。这可能有效,但它仍然无法完全解决上述问题。
EDIT2:
$result = $s3->getObject(array(
'Bucket' => $bucket,
'Key' => 'data.txt',
));
header('Content-type: ' . $result['ContentType']);
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-length:' . $result['ContentLength']);
echo $result['Body'];
但是仍然不认为这是理想的吗?
答案 0 :(得分:18)
S3Client::getObject()
method允许您指定S3在发送响应时应使用的标头。 getObjectUrl()
method使用GetObject操作生成URL,并且可以在其最后一个参数中接受任何有效的GetObject参数。您应该能够使用预先签名的URL通过以下方式直接进行S3到用户下载所需的标题:
$downloadUrl = $s3->getObjectUrl($bucket, 'data.txt', '+5 minutes', array(
'ResponseContentDisposition' => 'attachment; filename="' . $fileName . '"',
));
如果您想从服务器流式传输S3对象,那么您应该查看AWS PHP开发人员博客上的Streaming Amazon S3 Objects From a Web Server文章。
答案 1 :(得分:2)
这个问题没有得到充分回答。最初,它被问到如何在S3本地保存服务器本身的文件以便使用它。
因此,您可以将getAs选项与getObject方法一起使用。如果您在存储桶上使用版本控制并想要使用它,也可以指定版本ID。
$result = $this->client->getObject(array(
'Bucket'=> $bucket_name,
'Key' => $file_name,
'SaveAs' => $to_file,
'VersionId' => $version_id));
答案 2 :(得分:0)
新SDK的答案有点过时了。以下适用于v3 SDK。
$client->registerStreamWrapper();
$result = $client->headObject([
'Bucket' => $bucket,
'Key' => $key
]);
$headers = $result->toArray();
header('Content-Type: ' . $headers['ContentType']);
header('Content-Disposition: attachment');
// Stop output buffering
if (ob_get_level()) {
ob_end_flush();
}
flush();
// stream the output
readfile("s3://{$bucket}/{$key}");