使用Laravel从Amazon S3下载文件

Pra*_*ash 5 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;
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

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

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'];
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*lom 19

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

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

如果要从服务器流式传输S3对象,则应在AWS PHP Developer博客上查看来自Web服务器Streaming Amazon S3对象文章.