5

我有点确定如何使用 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;

以上工作,但我坚持在本地保存文件。如何正确使用 S3 的结果Response::download()

谢谢!

编辑:我发现我可以$s3->getObjectUrl($bucket, $file, $expiration)用来生成访问 URL。这可以工作,但它仍然不能完全解决上述问题。

编辑2:

$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'];

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

4

3 回答 3

20

S3Client::getObject()方法允许您指定 S3 在发送响应时应使用的标头。该getObjectUrl()方法使用 GetObject 操作来生成 URL,并且可以在其最后一个参数中接受任何有效的 GetObject 参数。通过执行以下操作,您应该能够使用预签名的 URL 使用所需的标头直接将 S3 下载到用户:

$downloadUrl = $s3->getObjectUrl($bucket, 'data.txt', '+5 minutes', array(
    'ResponseContentDisposition' => 'attachment; filename="' . $fileName . '"',
));

如果您想从您的服务器流式传输 S3 对象,那么您应该查看AWS 开发人员指南上的从 Web 服务器流式传输 Amazon S3 对象一文

于 2013-09-17T14:42:41.997 回答
2

这个问题没有完全回答。最初询问如何从 S3 将文件本地保存在服务器本身上以使用它。

因此,您可以将 SaveAs 选项与 getObject 方法一起使用。如果您在存储桶上使用版本控制并希望使用它,您还可以指定版本 ID。

$result = $this->client->getObject(array(
'Bucket'=> $bucket_name,
'Key'   => $file_name,
'SaveAs'  => $to_file,
'VersionId' => $version_id));
于 2014-07-17T13:11:15.687 回答
1

新 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}");
于 2016-12-11T05:07:46.730 回答