Php 使用Laravel从AmazonS3下载文件

Php 使用Laravel从AmazonS3下载文件,php,amazon-s3,laravel,Php,Amazon S3,Laravel,我有点确定如何从AmazonS3和Laravel4下载一个文件。我在用自动气象站 $result = $s3->getObject(array( 'Bucket' => $bucket, 'Key' => 'data.txt', )); // temp file $file = tempnam('../uploads', 'download_'); file_put_contents($file, $result['Body']); $respons

我有点确定如何从AmazonS3和Laravel4下载一个文件。我在用自动气象站

$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'];
但是仍然不认为它是理想的?

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

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

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

这个问题没有完全回答。最初,它被问及如何从S3在服务器上本地保存一个文件以利用它

$result = $this->client->getObject(array(
'Bucket'=> $bucket_name,
'Key'   => $file_name,
'SaveAs'  => $to_file,
'VersionId' => $version_id));
因此,您可以将SaveAs选项与getObject方法一起使用。如果您正在bucket上使用版本控制并希望使用它,那么还可以指定版本id

$result = $this->client->getObject(array(
'Bucket'=> $bucket_name,
'Key'   => $file_name,
'SaveAs'  => $to_file,
'VersionId' => $version_id));

对于新的SDK,答案有些过时。以下内容适用于V3SDK

$client->RegisterStreamRapper();
$result=$client->headObject([
“Bucket”=>$Bucket,
“Key”=>$Key
]);
$headers=$result->toArray();
标题('Content-Type:'.$headers['ContentType']);
标题(“内容处置:附件”);
//停止输出缓冲
if(ob_get_level()){
ob_end_flush();
}
冲洗();
//输出流
readfile(“s3://{$bucket}/{$key}”);

您所说的“本地保存”是什么意思?如果您将该文件存储在服务器上的某个位置,只需将
tempnam
替换为正确的(持久的)路径和文件名;但我不明白你为什么需要S3。)这就是问题所在-我想从SDK的一位作者那里下载S3Perfect解决方案。:)有关流媒体的文章链接到404。