2013-09-16 3 views
5

Я немного уверен относительно того, как начать загрузку файла с Amazon S3 с Laravel 4. Я использую AWSСкачать файл с Amazon S3 с Laravel

$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()?

Спасибо!

EDIT: Я нашел, что я могу использовать $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']; 

Тем не менее не думаю, что он идеально подходит, хотя?

+0

Что вы подразумеваете под «экономией на месте»? Если вы храните этот файл где-то на сервере, просто замените 'tempnam' правильным (постоянным) путем и именем файла; но я не понимаю, почему вам нужен S3.) – raina77ow

+0

В этом суть - я хочу запустить загрузку с S3 – Prash

ответ

18

S3Client::getObject() method позволяет указать заголовки, которые S3 следует использовать при отправке ответа. getObjectUrl() method использует операцию GetObject для создания URL-адреса и может принимать любые действительные параметры GetObject в своем последнем аргументе. Вы должны быть в состоянии сделать прямую загрузку S3-пользователь с желаемыми заголовками, используя предварительно подписанный URL, делая что-то вроде этого:

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

Если вы хотите, чтобы поток объекта S3 с вашего сервера, то вы должны проверить статью Streaming Amazon S3 Objects From a Web Server в блоге разработчиков PHP AWS.

+1

Идеальное решение от одного из авторов SDK. :) –

+0

Ссылка на статью о потоковой передаче идет до 404. – WhyAyala

2

Этот вопрос не отвечает полностью. Первоначально было предложено сохранить файл локально на самом сервере с S3, чтобы использовать его.

Итак, вы можете использовать опцию SaveAs с методом getObject. Вы также можете указать идентификатор версии, если вы используете управление версиями в своем ковше и хотите использовать его.

$result = $this->client->getObject(array(
'Bucket'=> $bucket_name, 
'Key' => $file_name, 
'SaveAs' => $to_file, 
'VersionId' => $version_id)); 
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}"); 
Смежные вопросы