3

そのようなタイプの質問がSFに存在することは知っていますが、それらは非常に具体的であり、一般的な提案が必要です。1GBを超えるサイズのユーザーファイルをアップロードする機能が必要です。この機能は、より小さなファイルに対応するアプリケーションに存在する既存のファイルアップロード機能へのアドオンになります。さて、ここにいくつかのオプションがあります

  1. HTTPおよびJavaアプレットを使用します。ファイルをチャンクで送信し、サーバーで結合します。しかし、n/wを絞る方法。
  2. HTTPおよびFlexアプリケーションを使用します。ブラウザの互換性やその他の環境問題よりも優れていますか?
  3. アップロードプロセスを高速化するためのプロトコルとして、HTTPではなくFTPまたはSFTPを使用する

提案してください。

さらに、このアップロードプロセスが他のユーザーのタスクを妨げないようにする必要があります。つまり、他のユーザーの白黒を使い果たしないようにする必要があります。そのようなプロセスを抑制するためにn/wレベルで実行できるメカニズムはありますか?

最終的に、顧客はオプションとしてFTPを使用したいと考えていました。しかし、プログラムでファイルを処理することでの答えもクールだと思います。

4

4 に答える 4

13

必要なクライアント側言語(Javaアプリ、Flexなど)を使用し、HTTP PUT(Flexなしで)またはを使用してサーバーにプッシュしますPOST。サーバー側のJavaコードで、入力ストリームループ内のバイトのフローを調整します。帯域幅を平均<=10KB/秒以下に制限する、大まかなシンプルなサンプルスニペット:

InputStream is = request.getInputStream();
OutputStream os =  new FileOutputStream(new File("myfile.bin"));
int bytesRead = 0;
byte[] payload = new byte[10240];

while (bytesRead >= 0) {
    bytesRead = is.read(payload);

    if (bytesRead > 0) 
        os.write(payload, 0, bytesRead);

    Thread.currentThread().sleep(1000);
}

(複雑さが増すと、単一ストリームの帯域幅をより正確に調整できますが、ソケットバッファーなどを考慮すると複雑になります。通常、「十分」で十分です。)

私のアプリケーションは上記と同様のことを行います。アップストリーム(POSTPUT)と(GET)の両方のダウンストリーム帯域幅を調整します。毎日数百MBのファイルを受け入れ、最大2GBをテストしました。(2GBを超えると、対処すべき厄介なJava intプリミティブの問題があります。)クライアントはFlexと。の両方curlです。それは私のために働きます、それはあなたのために働くことができます。

FTPは素晴らしいものですが、HTTPを使用することで、ファイアウォールの問題の多く(すべてではありません)を回避できます。

于 2009-07-07T05:49:07.407 に答える
4

帯域幅を減らしたい場合は、データを圧縮して送信することをお勧めします(すでに圧縮されている場合を除く)。これにより、送信する内容によっては、データ量が2〜3倍節約される場合があります。

于 2009-07-07T05:53:30.237 に答える
1

大きなファイルをアップロードするためのグッドプラクティスの例と、それに取り組むさまざまな方法については、flickr.comをご覧ください(アップローダーページにアクセスするには、サインアップする必要がある場合があります)。

それらは、HTTPフォームのアップロード、Javaデスクトップクライアント、または私が完全には理解できないある種のjavascript駆動のガジェットを含むさまざまなオプションを提供します。彼らはどこでもフラッシュを使用していないようです。

于 2009-07-07T21:18:44.823 に答える
0

サーバーにファイルを送信するには、HTTPを使用する必要ない限り、FTPが最適です。スロットル、少なくともプログラム的には完全にはわかりません。

個人的には、アップロード速度の制限はサーバー側でより適切に達成されるようです。

于 2009-07-06T19:57:23.927 に答える