LoginSignup
fuzigiwa2
@fuzigiwa2 (義将 藤極)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

S3サーバーからEC2サーバーにファイルをダウンロードしたい。

laravelで開発しております。

初歩的な質問かと思いますが、S3サーバーからEC2サーバーへはどのようにしてファイルをダウンロードするのでしょうか。
こちらバイト配列としてダウンロードできるのでしょうか。

S3サーバーからファイルを取得して、末尾にバイト配列を結合して、再びS3サーバーにファイルを上書き保存することを考えております。

よろしくお願い致します。

0

1Answer

S3からWebアプリケーションを経由してデータをダウンロードする機能について実装するのであれば、AWS SDK を使用してダウンロードを行うのが適切かと思います。

AWSの公式ドキュメントにはGetObjectを行うサンプルコードがあるため、こちらを参考に実装をすると良いかもしれません。

0

Comments

  1. @fuzigiwa2

    Questioner
    S3サーバーからEC2サーバーへのファイル取得ですが、下記のようなコードで対応いたしました。

    ```
    class Media extends Model
    {
    public function getPreSignedUrl($minutes)
    {
    $url = \Storage::disk('s3')
    ->temporaryUrl(
    $this->file_name,
    Carbon::now()->addMinute($minutes));
    return $url;
    }
    }

    class MediaController extends Controller
    {
    public function uploadSplit(Request $request, Media $media)
    {
    $input = $request->all();

    $content = Storage::disk('s3')->get( $media->getPreSignedUrl(10) );

    if( isset( $content ) )
    {
    return [
    'message' => 'ok',
    ];
    }

    return [
    'message' => 'ng',
    ];
    }
    }
    ```

    「$content」を使用してバイナリ操作を行おうとしたのですが、途中から

    ```
    League\\Flysystem\\FileNotFoundException(code: 0): File not found at path:
    ```

    といったエラーが出るようになりました。
    エラー文の前後にはS3サーバーのファイルダウンロードURLがついております。

    こちら一時的なURLの取得ではいけないのでしょうか。
    また、取得した「$content」をバイナリファイルとして扱うことは出来るのでしょうか。

    初歩的な質問かと思いますがよろしくお願い致します。
  2. 前提となっている条件が正しくないかと思われます。
    S3はEC2のようなLinuxのインスタンスではありません。
    そのため、ファイルシステムの概念もないのがお見受けしたエラーの回答となります。

    ファイルをダウンロードするにはドキュメントにもあるようにクライアント側でS3クライアントをインスタンス化し下記のようにオブジェクトを取得します。

    下記コードのようなダウンロードは試されていますでしょうか?

    まずダウンロードそのものが可能であるかを確認した上でデータ構造の質問をした方が良いかと思います。

    require 'vendor/autoload.php';

    use Aws\S3\S3Client;
    use Aws\S3\Exception\S3Exception;

    $bucket = '*** Your Bucket Name ***';
    $keyname = '*** Your Object Key ***';

    $s3 = new S3Client([
    'version' => 'latest',
    'region' => 'us-east-1'
    ]);

    try {
    // Get the object.
    $result = $s3->getObject([
    'Bucket' => $bucket,
    'Key' => $keyname
    ]);

    // Display the object in the browser.
    header("Content-Type: {$result['ContentType']}");
    echo $result['Body'];
    } catch (S3Exception $e) {
    echo $e->getMessage() . PHP_EOL;
    }

Your answer might help someone💌