14

私はS3PHPクラスを使用してAmazonS3を学習しています。すべてのファイルをS3バケットにアップロードしました。次に、バケット内の使用可能なファイルごとにリンクを作成します。

次の機能は動作しますか?

public static function getAuthenticatedURL($bucket, $uri, $lifetime, $hostBucket = false, $https = false)
{

}

    $s3 = new S3('access-key', 'secret-key');
    $s3->getAuthenticatedURL($bucket, $uri, $lifetime, $hostBucket = false, $https = false);

またはget_object_url、のような別の関数ですがget_object_url()、私のS3クラスにはありません。

UndesignedのAmazonS3PHPクラスを使用しています。

4

5 に答える 5

14

次のパターンは、S3URLの作成に有効です。

http(s)://<bucket>.s3.amazonaws.com/<object>
http(s)://s3.amazonaws.com/<bucket>/<object>
于 2012-05-19T11:23:55.753 に答える
13

一般の人にバケットにアクセスしてもらいたい場合は、次のように簡単です。

http:// [YourBucketName] .s3.amazonaws.com / [YourFileName]

権限を正しく設定している限り。

ダウンロードの悪用が心配な場合は、認証されたURLが必要になります(コードサンプルから必要だと思います)。その場合は、Amazon SDK(http://aws.amazon.com/sdkforphp/ )を使用することをお勧めします。これには、必要なものの例が含まれています。

$s3->getObjectUrl($bucket, $filename, '5 minutes');

ドキュメント:http ://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.S3Client.html#_getObjectUrl

于 2012-05-19T08:48:07.873 に答える
3

Hosseinの回答に加えて、リンクにアクセスした直後にダウンロードを開始する場合(「名前を付けて保存...」の動作をシミュレート)、次のように、バケットとキーの横にResponseContentDispositionパラメーターを追加する必要があります。

$cmd = $s3Client->getCommand('GetObject', [
    'Bucket' => 'my-bucket',
    'Key' => 'testKey',
    'ResponseContentDisposition' => 'attachment; filename="custom_file_name.mp3"'
]);

$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');

$presignedUrl = (string) $request->getUri();

注:カスタムファイル名はオプションです。指定しない場合、ダウンロードされたファイルにはS3名が付けられます。

于 2020-04-15T17:20:24.710 に答える
2

人々はすでにこれに反応しているようですが、セキュリティで保護されたバケット(アクセスが必要)を持っている可能性のある人々のために、もう少しコンテキストを追加したいと思いました。S3バケットと直接通信する場合はURLを生成する必要がないことに注意してください。その後、「file_get_contents」などを使用できますが、マルチカールリクエストを使用できないため(速度のため)、はるかに遅くなります。ただし、新しいphpリリースがある場合は、pthreadを使用できます。

インストール:Amazon用のS3クラスファイルをインストールします。composerを使用するか、S3.phpファイルを手動でダウンロードするだけで簡単に追加できます。

セキュリティで保護されていません:(この問題に関する他の投稿を参照してください。基本的にURLを使用してください)

http(s)://<bucket>.s3.amazonaws.com/<object>
http(s)://s3.amazonaws.com/<bucket>/<object>

セキュリティで保護されたHTTPS(バケットを保護している場合):

https://amazon.com/file/you/wanted.xxx?ID:XXXXX?SIG:YYYYY  

(1)https:// urlを作成し、マルチカールツールを使用してそれらをすべて同時に取得します(推奨)。

単純な例:

$url = /path/to_the/file_name/file.ext  

//note check amazon to confirm the path which will contain only "_" and no spaces.

$s3 = new S3($awsAccessKeyID, $awsSecretKey);
$curls[] = $s3->get_object_url($bucketName, $uri, '1 hour');
var_dump($results = multiCurlRequest($curls));    

より詳しい情報:

http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.S3.S3Client.html#_getObjectUrl http://undesigned.org.za/2007/10/22/amazon -s3-php-クラス/ドキュメント

ご参考までに:

function multiCurlRequest($curlList = array(),$user = '', $pass = '',$timeout = self::MULTI_REQ_TIMEOUT_SECS, $retTxfr = 1) {

    if (empty($curlList) || count($curlList) == 0) return false;

    $master = curl_multi_init();
    $node_count = count($curlList);

    for ($i = 0; $i < $node_count; $i++) {
        $ch[$i] = curl_init($curlList[$i]);
        curl_setopt($ch[$i], CURLOPT_TIMEOUT, $timeout); // -- timeout after X seconds
        curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, $retTxfr);
        curl_setopt($ch[$i], CURLOPT_HTTPAUTH, CURLAUTH_ANY);
        curl_setopt($ch[$i], CURLOPT_USERPWD, "{$user}:{$pass}");
        curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
        curl_multi_add_handle($master, $ch[$i]);
    }

    // -- get all requests at once, finish when done or timeout met --
    do {  curl_multi_exec($master, $running);  }
    while ($running > 0);

    $results = array();

    // -- get results from requests --
    for ($i = 0; $i < $node_count; $i++) {
        $results[$i] = curl_multi_getcontent($ch[$i]);
        if ((int) curl_getinfo($ch[$i], CURLINFO_HTTP_CODE) > 399 || empty($results[$i])) {
            $this->set_request(  [ ['label' => '404', 'href' => $results[$i], '404' => '1' ] ] );
            unset($results[$i]);
        }
        curl_multi_remove_handle($master, $ch[$i]);
        curl_close($ch[$i]);
    }

    curl_multi_close($master);
    if (empty($results)) return false;
    //$results = array_values($results); // -- removed as we want the original positions
    return $results;
}
于 2017-02-06T13:49:58.833 に答える
2

を使用aws-sdk-php v3し、ファイルが非公開の場合。

$cmd = $s3Client->getCommand('GetObject', [
    'Bucket' => 'my-bucket',
    'Key' => 'testKey'
]);

$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');

$presignedUrl = (string) $request->getUri();
于 2018-12-13T08:34:57.393 に答える