Скачать файл с Amazon S3 с помощью Laravel

Я немного уверен, как запустить загрузку файла с Amazon S3 с Laravel 4. Я использую 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() ?

Благодаря!

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

Тем не менее, не думайте, что это идеальный вариант?

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

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

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

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

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

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

Ответ несколько устарел от нового 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}");