

laravelで開発しております。

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

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

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

4/18 追記になります。

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

[code]

    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',
            ];
        }
    }
    
[/code]

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

[code]

    League\\Flysystem\\FileNotFoundException(code: 0): File not found at path:
    
[/code]

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

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

初歩的な質問かと思いますがよろしくお願い致します。


CC BY-SA 4.0
2021-04-16T02:39:02.297
75317
2021-04-18T05:16:27.120
2021-04-18T05:16:27.120
29606
29606
question
php aws laravel amazon-ec2 amazon-s3
S3サーバーからEC2サーバーにファイルをダウンロードしたい。


はい、LaravelでもS3のデータをローデータのまま読み書きすることができます。

AWS SDK for PHPを利用する方法でももちろん可能ですが、Laravelに備わっているFile
Storage機能を利用するとローカルストレージの読み書きと同様の方法で操作できるため手軽です。

  * [公式ドキュメント（英語）](https://laravel.com/docs/8.x/filesystem)
  * [日本語訳](https://readouble.com/laravel/8.x/ja/filesystem.html)

詳細はドキュメントをご確認頂ければと思いますが、おおまかには

  * EC2にS3へのアクセス権を付与 
    * `.env` にS3にアクセス可能な `AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` を設定するか、あるいはEC2にS3アクセス可能なロールをアタッチする
  * Composerで必要なパッケージを追加 
    * `composer require "league/flysystem-aws-s3-v3 ~1.0"`
  * S3のインスタンスを取得して読み書き

[code]

    use Illuminate\Support\Facades\Storage;
    
    $content = Storage::disk('s3')->get('path/to/file');
    Storage::disk('s3')->put('path/to/file', $content);
    
[/code]

というような流れで利用します。

なお、もしストレージにS3しか利用しないということであれば `.env` の `FILESYSTEM_DRIVER` を `s3` にしておけば
`disk('s3')` の指定は省略できます。

`s3` というディスクの定義については `config/filesystem.php` にあり、こちらは自由に設定できるので `s3-primary`
`s3-secondary` などを追加して複数のディスクを行き来したりすることもできます。


CC BY-SA 4.0
2021-04-16T05:19:50.127
75321
2021-04-16T05:25:17.097
2021-04-16T05:25:17.097
784
784
75317
answer