使用Laravel从Amazon S3下载文件

时间:2013-09-16 23:52:54

标签: php amazon-s3 laravel

我对如何使用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'];

但是仍然不认为这是理想的吗?

3 个答案:

答案 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}");