@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サーバーへのファイル取得でエラーが出る

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」をバイナリファイルとして扱うことは出来るのでしょうか。

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

0 likes

1Answer

回答になるかわかりませんが...

恐らくですが、StorageのgetにURLは指定しないのが通常かと思います。
URLからファイルを取得したいのであれば、file_get_contents等で十分なはずです。
また、PreSigned URLを利用している理由がわかりません。
Storageからファイルを取得する場合、適切にStorageおよびIAMの設定を行っている限りでは、ファイルパス(Key)のみ指定してやれば良いかとおもいます。

ブラウザなどのクライアントからアップロードさせたい場合、PreSigned URLのみ返却してやればいいです。
以下の記事などを参考に。(以下の方法を試すのであれば、ロールは専用に用意し、STSでのロール切り替えに対応させた方がセキュアかとおもいます。PreSigned URLにACCESS_KEY_IDが入るので)
https://dev.classmethod.jp/articles/upload-file-by-non-aws-user-with-s3-presigned-url/

0Like

Your answer might help someone💌