4

Rails では、この Heroku の記事に従って、S3 バケットにファイルを直接アップロードできるようにしました。以前の実装ではマルチパート アップロード (つまり、大きなファイル) が機能しなかったため、実際にこの記事に従いました。このメソッドを実装すると、非常に大きなファイルを除いて、大きなファイルが正常にアップロードされました。

awsRails のバージョンのため、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>
4

3 に答える 3

1

プランA

チャンクアップロードを正しく設定しましたか?

https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads

Heroku の記事では、ファイルのアップロードを処理するjquery プラグインでのチャンク アップロードの設定については何も言及されていません。

FAQには次のように書かれています:

jQuery File Upload プラグインを使用すると、最大 4 GB のファイルをアップロードできます。チャンク ファイル アップロード (4 GB 未満のチャンク) を利用することで、潜在的なファイル サイズは無制限になります。4 GB の制限は、一部のブラウザーの制限によるものであり、これらのブラウザーの今後の更新で修正される可能性があります。

チャンク アップロードのドキュメントはこちらmaxChunkSizeです。チャンクのサイズを定義するプロパティを定義する必要があります。

$('#fileupload').fileupload({
    maxChunkSize: 10000000 // 10 MB
});

次の手段

ファイルのアップロードを受け入れ、AWS SDK を介して S3 に転送する最小限の node.js インスタンスを作成できます。

無料の heroku インスタンスで実行することもできます。これは、おそらく 1 日 6 時間スリープ状態にできる可能性があるためです。私は、この方法でホストされているファイル アップロード サービスについて良い経験を積んでいます。

于 2016-01-18T08:06:31.767 に答える
0

heroku + s3 ファイル アップロードを使用している場合は、gem 's3_direct_upload' を使用することをお勧めします。これを使用すると、heroku サーバーに接続せずにファイルを AWS::S3 にアップロードできます。サーバーと s3-bucket 間の直接通信を作成します。

詳細については、このリンクを使用できます

これにより、コンテンツを検証したり、ファイルのサイズを検証したりする場合に、JavaScript をほとんど使用する必要がなくなります。

于 2016-01-18T11:11:38.690 に答える
-1

私は Signiant でプロダクト マネージャーとして働いており、非常に大きなファイルのみを扱っています。これは、他の AWS ユーザーの何人かからも見られました。本当に大きなファイルをアップロードするために TCP / HTTP を使用した結果だと思います。

アップロードには、HTTP 以外のものを検討することをお勧めします。私が管理している Signiant Flight は UDP ベースで、非常に大きなファイルを簡単に処理できます。価格は年間 12,000 ドルから。

UDT ( http://udt.sourceforge.net ) や Tsunami ( http://tsunami-udp.sourceforge.net )など、他の無料のオープン ソース UDP ツールも利用できます。UDP を使用するには、接続する EC2 のサーバーが必要です。次に、そのサーバーにデータを S3 に書き込みます。

Flight は管理されたファイル転送サービスです。クラウドでサーバーを実行し、800 ~ 900 Mbps の速度を実現できます。

于 2016-01-15T21:53:05.687 に答える