Я немного уверен, как запустить загрузку файла с 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}");