スクリプトがphpを介してAmazonS3バケットにtest.jpgを表示するようにしようとしています。これが私がこれまでに持っているものです:
require_once('library/AWS/sdk.class.php');
$s3 = new AmazonS3($key, $secret);
$objInfo = $s3->get_object_headers('my_bucket', 'test.jpg');
$obj = $s3->get_object('my_bucket', 'test.jpg', array('headers' => array('content-disposition' => $objInfo->header['_info']['content_type'])));
echo $obj->body;
これは、ページ上のファイルデータをダンプするだけです。 get_object()メソッドで行われていると思っていたcontent-dispositionヘッダーも送信する必要があると思いますが、そうではありません。
注:ここで入手できるSDKを使用しています: http://aws.Amazon.com/sdkforphp/
$ object本体をエコーする前に、content-typeヘッダーをエコーすることで機能するようになりました。
$objInfo = $s3->get_object_headers('my_bucket', 'test.jpg');
$obj = $s3->get_object('my_bucket', 'test.jpg');
header('Content-type: ' . $objInfo->header['_info']['content_type']);
echo $obj->body;
これらの方法は両方とも私のために働きます。最初の方法はもっと簡潔に思えます。
$command = $s3->getCommand('GetObject', array(
'Bucket' => 'bucket_name',
'Key' => 'object_name_in_s3'
'ResponseContentDisposition' => 'attachment; filename="'.$my_file_name.'"'
));
$signedUrl = $command->createPresignedUrl('+15 minutes');
echo $signedUrl;
header('Location: '.$signedUrl);
die();
または、より言葉が多いが、それでも機能的な方法。
$object = $s3->getObject(array(
'Bucket' => 'bucket_name',
'Key' => 'object_name_in_s3'
));
header('Content-Description: File Transfer');
//this assumes content type is set when uploading the file.
header('Content-Type: ' . $object->ContentType);
header('Content-Disposition: attachment; filename=' . $my_file_name);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
//send file to browser for download.
echo $object->body;
PHP sdk3の場合、Maximusの回答の最後の行を変更します
$object = $s3->getObject(array(
'Bucket' => 'bucket_name',
'Key' => 'object_name_in_s3'
));
header('Content-Description: File Transfer');
//this assumes content type is set when uploading the file.
header('Content-Type: ' . $object->ContentType);
header('Content-Disposition: attachment; filename=' . $my_file_name);
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
//send file to browser for download.
echo $object["Body"];
2019+でも関連する回答を探している場合は、AWS SDK for PHP 3.x、特に「2006-03-01」とcomposerを使用すると、次のことがうまくいきました
...
/**
* Download a file
*
* @param string $object_key
* @param string $file_name
* @return void
*/
function download($object_key, $file_name = '') {
if ( empty($file_name) ) {
$file_name = basename($file_path);
}
$cmd = $s3->getCommand('GetObject', [
'Bucket' => '<aws bucket name>',
'Key' => $object_key,
'ResponseContentDisposition' => "attachment; filename=\"{$file_name}\"",
]);
$signed_url = $s3->createPresignedRequest($cmd, '+15 minutes') // \GuzzleHttp\Psr7\Request
->getUri() // \GuzzleHttp\Psr7\Uri
->__toString();
header("Location: {$signed_url}");
}
download('<object key here>', '<file name for download>');
注:これは、AWSからの直接ダウンロードリンクを使用して、サーバーを介してダウンロードをプロキシすることから発生する可能性のある問題を回避したい場合のソリューションです。
Content-DispositionヘッダーをgetAuthenticatedUrl()に追加しました。
// Example
$timeOut = 3600; // in seconds
$videoName = "whateveryoulike";
$headers = array("response-content-disposition"=>"attachment");
$downloadURL = $s3->getAuthenticatedUrl( FBM_S3_BUCKET, $videoName, FBM_S3_LIFETIME + $timeOut, true, true, $headers );
このスクリプトは、AmazonS3やDigitalOceanスペースなどのS3サービスのすべてのディレクトリにあるすべてのファイルをダウンロードします。
composer require aws/aws-sdk-php
を実行しますphp index.php
を実行し、リッピングさせます。DOアカウントを閉鎖できるように、ジョブを実行するためのコードを記述しただけであることに注意してください。それは私がそれを必要とすることをします、しかしそれをより拡張可能にするために私がすることができたいくつかの改善があります。楽しい!
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
class DOSpaces {
// Find them at https://cloud.digitalocean.com/account/api/tokens
const CREDENTIALS_API_KEY = '';
const CREDENTIALS_API_KEY_SECRET = '';
const CREDENTIALS_ENDPOINT = 'https://nyc3.digitaloceanspaces.com';
const CREDENTIALS_REGION = 'us-east-1';
const CREDENTIALS_BUCKET = 'my-bucket-name';
private $client = null;
public function __construct(array $args = []) {
$config = array_merge([
'version' => 'latest',
'region' => static::CREDENTIALS_REGION,
'endpoint' => static::CREDENTIALS_ENDPOINT,
'credentials' => [
'key' => static::CREDENTIALS_API_KEY,
'secret' => static::CREDENTIALS_API_KEY_SECRET,
],
], $args);
$this->client = new S3Client($config);
}
public function download($destinationRoot) {
$objects = $this->client->listObjectsV2([
'Bucket' => static::CREDENTIALS_BUCKET,
]);
foreach ($objects['Contents'] as $obj){
echo "DOWNLOADING " . $obj['Key'] . "\n";
$result = $this->client->getObject([
'Bucket' => 'dragon-cloud-assets',
'Key' => $obj['Key'],
]);
$this->handleObject($destinationRoot . $obj['Key'], $result['Body']);
}
}
private function handleObject($name, $data) {
$this->ensureDirExists($name);
if (substr($name, -1, 1) !== '/') {
echo "CREATING " . $name . "\n";
file_put_contents($name, $data);
}
}
private function ensureDirExists($name) {
$dir = $name;
if (substr($name, -1, 1) !== '/') {
$parts = explode('/', $name);
array_pop($parts);
$dir = implode('/', $parts);
}
@mkdir($dir, 0777, true);
}
}
$doSpaces = new DOSpaces([
'endpoint' => 'https://nyc2.digitaloceanspaces.com',
'credentials' => [
'key' => '12345',
'secret' => '54321',
],
]);
$doSpaces->download('/home/myusername/Downloads/directoryhere/');