Php 使用Laravel从AmazonS3下载文件
我有点确定如何从AmazonS3和Laravel4下载一个文件。我在用自动气象站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
$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。