4

ブラウザーからの非常に大きなアップロード (従来の入力 type="file" または Java アプレットのいずれか) を処理する必要があり、サーバー上でジョブを実行するための最適なツールを探している次のプロジェクトがあります。

これらは私が必要とするものです:

  • サーバーのメモリ消費量が少ない
  • サーバー上の最終的な宛先にファイルを保存する機能 (ファイルをコピーしない)
  • ウェブサーバーによって行われる他の重要なタスクをブロックしない
  • 2 GB までのファイルの適切な処理
  • ファイルの承認 (権限はアプリで付与されます)

どのテクノロジーを使用するかについてはまだある程度の自由度があるため、このタスクを処理するサーバーで最適なテクノロジーを選択できるようにするために、いくつかのアドバイスをお願いします。

  • ASP.NET?
  • ジャワ?
  • アマゾンS3?
  • 他の選択肢?

私は Microsoft Stack に慣れていますが、必要に応じて変更しても構わないと思っています。上で述べたように、仕事に最適なツールを探しているだけです。

ありがとう !

更新: サーバー側は、クライアント側ではなく、この質問で私が本当に興味を持っている部分です。

些細なことのように見えますが、少し掘り下げ始めると、.NET での 4 Mb の制限、大量のメモリを使用するダウンロード、他のスレッドをブロックする可能性があることがわかります (スレッドの数に制限がある場合、そして、スレッドがインターネット経由で 2 Gb ファイルのアップロード/ダウンロード中に実行できる場合: まあ、これはうまくスケーリングできませんか?) など。

4

7 に答える 7

6

あなたは必要になるでしょう:

  • ファイルを小さなチャンクに分割するためのクライアント側コード (Java アプレット、Silverlight など)
  • これらのファイルを元に戻すためのサーバー側コード (ASP.NET、Java は関係ありません)

私はちょうどそのようにアプリケーションを完成させました。ファイル ストレージには、Silverlight (WebRequest非同期)、ASP.NET ( IHttpHandler/ IHttpAsyncHandler)、および SQL Server 2005 ( UPDATETEXT/ ) を使用します。READTEXT

更新: ASP.NET サーバー側コードについて:

ASP.NET の既定の構成では、プロセッサごとに 100 スレッドが許可されます。IHttpAsyncHandlerプロセスをブロックせず、ファイルの内容を に直接書き込むことができますcontext.Response.OutputStream

アップロードの場合、複数のデータ チャンクも送信しますが、複数の HTTP 接続で送信します。これは HTTP ヘッダーによる過熱を引き起こす可能性がありますが、私のテストでは非常にうまく機能します。

于 2009-11-04T16:20:21.560 に答える
4
  • サーバーのメモリ消費量が少ない

入力をメモリではなくディスクに直接書き込みます。
Java 用語では、FileOutputStream/BufferedOutputStream を使用します。

  • サーバー上の最終的な宛先にファイルを保存する機能 (ファイルをコピーしない)

上記を参照。

  • ウェブサーバーによって行われる他の重要なタスクをブロックしない

各リクエストは独自のスレッドで実行されるため、心配する必要はありません。それは、すべてをどのようにコーディングするかにかかっています。

  • 2 GB までのファイルの適切な処理

ファイルをディスクに直接書き込む場合は問題ありません。
Java 用語では、Apache Commons FileUpload API を使用できます。

  • ファイルの承認 (権限はアプリで付与されます)

あなたが話している承認のレベルがわからない。ディスクファイルシステムレベル? ウェブアプリケーションレベル? クライアントレベル?

于 2009-11-04T16:31:16.180 に答える
1

On the client side, the input type="file" through HTTP POST has its shortcomings - notably, it's unable to compress uploads (probably not an issue) nor can it resume transfers (this can be painful when 1000 MB upload fails at 990 MB). SWFUpload, although it's great in other aspects, relies on the browser's HTTP POST implementation.

I'd probably go with a Java applet on the client - this would allow to establish the connection and check for necessary permissions prior to uploading; although that path has its problems too:

  • FS access permissions (signed applet?)
  • writing your own HTTP uploader
  • proxy handling

also give an option to fall back to plain old HTTP POST too.

Server-side can be written in pretty much anything, as long as you can process the data as they arrive (i.e. don't wait until you have the whole file).

于 2009-11-04T16:26:45.103 に答える
0

asp.netの非同期ファイルアップロードを使用してこれを行うことができます。ユーザーにそれを提示するためのフラッシュ付き。

http://swfupload.org/node/47

于 2009-11-04T16:14:33.203 に答える
0

uploadifyを使用できます。私はこれを数回使用したことがあり、常に私のニーズに合っています。これは、フラッシュを使用して、必要に応じて複数のファイルを一度にアップロードできるようにする非同期ファイルアップローダーです。

于 2009-11-04T16:15:38.100 に答える
0

アップロードには BITS を使用できます。

http://www.simple-talk.com/dotnet/.net-tools/using-bits-to-upload-files-with-.net/

于 2009-11-04T16:16:38.220 に答える
0

私の経験に基づく他のいくつかの簡単なメモ...

  1. input type=file は、大きなファイルに対しては確実に機能しません (メモリが原因)
  2. 一部のファイル アップロード コンポーネントはメモリの問題を解決しますが、クライアントからサーバーへの転送でバイトが失われると問題が残ります。
  3. データのチャンク化をサポートする Java アプレットを確認する必要があります。

それが機能する方法は、Java アプレットがファイルを管理可能なチャンクに分割し、バイトからハッシュを作成することです。サーバーがチャンクを受信すると、受信したバイトのハッシュを Java アプレットによって提供されたハッシュと比較する必要があります。

ハッシュが一致しない場合は、チャンクを再試行します。一致する場合は、次のチャンクに進みます。次に、ツールを使用してすべてのチャンクを元に戻します。

于 2009-11-04T17:03:26.473 に答える