Rails では、この Heroku の記事に従って、S3 バケットにファイルを直接アップロードできるようにしました。以前の実装ではマルチパート アップロード (つまり、大きなファイル) が機能しなかったため、実際にこの記事に従いました。このメソッドを実装すると、非常に大きなファイルを除いて、大きなファイルが正常にアップロードされました。
aws
Rails のバージョンのため、gemの v1 を使用しているという点で、この記事から少し逸脱していることに注意してください。
これが私のセットアップ方法です:
S3_BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET_NAME']]
def set_s3_post_url
@s3_media_post_url = S3_BUCKET.presigned_post(key: "product_media/#{SecureRandom.uuid}-${filename}", success_action_status: '201', acl: 'public-read')
end
前述のように、これは大きなファイル (〜 1 GB) で機能しますが、たとえば 10 GB のファイルをアップロードしようとすると、ほとんどアップロードされた状態になり、ランダムに失敗します。20分後のときもあれば、1時間後のときもあります。署名付き URL の有効期限が切れているのではないかと思い、 で明示的に長い有効期限を設定しましたexpires: Time.now + 4.hours
が、うまくいかないようでした。
誰かが何かアイデアを持っていれば、これについて何か助けていただければ幸いです!
アップデート
を使用する@bbozoの回答を試しましmaxChunkSize
たが、残念ながらそれはうまくいかなかったようです。ただし、コンソールで XHR リクエストを監視していたところ、失敗したものは AWS から次の XML レスポンスを返しました。
<Error>
<Code>InternalError</Code>
<Message>We encountered an internal error. Please try again.</Message>
<RequestId>1231BD4A29EE5291</RequestId>
<HostId>f5muQPj2lT2Tmqi49ffqjT4ueLimYvrWUJL6WRW+F7vgm2rL1+FOD3pmsKOEYxFaSFXzLiEZjTg=</HostId>
</Error>