私はアマチュアの ASP.net 開発者で、最初の仕事 (友人の Web サイト) に取り組んでいます。ASP.net v4.0、VS2010 を使用。
彼の会社は 3D モデルを作成しています (3D プリンターを使用)。ウェブサイトは現在開発中ですが、ここで見つけることができます。コードが少し急いでハッキングされていることを認めるのは私が最初ですが、私の友人はこれまでのところ非常に満足しています。
要件の 1 つは、顧客がモデル設計ファイルをアップロードできる必要があることです。これは、それぞれ最大 100 MB (またはそれ以上) になる可能性があります。これを適切に機能させるのに苦労しています。
Joe Stagner のチュートリアル<asp:FileUpload ID="FileUpload1" runat="server" />
で説明されているアイデアと同様に、組み込みのタグとアニメーション gif 画像を使用することから始めました。Joeに感謝します。あなたのプレゼンテーションがとても気に入っています。
これは、小さなテスト ファイルでは問題なく機能しましたが、アップロードの進行状況を示すものではありません。そこで、コード プロジェクトの記事で Sunasara Imdadhusen から開発されたアイデアを使用して、ソリューションを改善しようとしました。私のアップロードコードは次のようになります。
Task t = Task.Factory.StartNew(() =>
{
byte[] buffer = new byte[UPLOAD_BUFFER_BYTE_SIZE];
// Upload the file in chunks so that we can measure how long it is taking.
using (FileStream fs = new FileStream(Path.Combine(newQuotePath, filename), FileMode.Create))
{
DateTime stopwatch = DateTime.Now;
while (stats.Uploaded < stats.TotalSize)
{
int bytecount = postedFile.InputStream.Read(buffer, 0, UPLOAD_BUFFER_BYTE_SIZE);
fs.Write(buffer, 0, bytecount);
stats.Uploaded += bytecount;
double dRate = UPLOAD_BUFFER_BYTE_SIZE / Math.Abs((DateTime.Now - stopwatch).TotalSeconds);
stats.Rate = (int)(Math.Min(dRate, int.MaxValue));
// Sleep is for debugging only!
//System.Threading.Thread.Sleep(2000);
stopwatch = DateTime.Now;
}
}
}, TaskCreationOptions.LongRunning);
は、セッション変数として格納され、 PageMethodによって (アップロードstats
の実行中に) で実行されている JavaScript 関数からアクセスされるクラスへの参照です。setInterval(...)
[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static UploadStatus GetFileUploadStatus()
{
UploadStatus stats = (UploadStatus)HttpContext.Current.Session["UploadFileStatus"];
if ((stats != null) && (stats.IsReady))
{
return stats;
}
else
{
return null;
}
}
これは私のローカルマシンで機能しました(スレッドスリープを使用してアップロードを遅くしました)。そのため、ホスト123-Regに公開しましたが、期待どおりに動作しませんでした。アップロードが始まるとアニメーション GIF が表示されますが、プログレス バーが動きません。アップロードが開始されるとすぐに無効になるはずのファイル入力コントロールと送信ボタン (IFrame 内) が無効になるまでに時間がかかります。次に、Webページがハングします。しばらく待ってから、ページの更新ボタンをクリックしました。ページが更新されると、テスト ファイルが正常にアップロードされたことが示されました。16KBのファイルと1.6MBのファイルを試してみました。
これは私のローカル マシンで機能していたので、私たちの Web サイト ホスト (123-Reg) が Web ファームを使用しているためにこの問題が発生していると思われます。
とにかく、これは簡単だと思っていましたが、そうではなかったので、オープンソースのアップロード進行状況バーを探しました。NeatUploadを見てみましたが、「デフォルトでは、NeatUpload は Web ガーデンまたは Web ファームでは正しく動作しません」とあり、Web ファームで動作させるには「同じランダムな 32-hex-各サーバーの Web.config のセクションにある数字の decryptionKey 属性". しかし、123-Reg のサーバー構成ファイル (?) にアクセスできないと思います。
私の友人は、ドロップボックスなどのサービスを使用できるかもしれないと提案しましたが、私は見ましたが、これを私たちのウェブサイトに追加する方法がわかりません. アップロード用に最適化されている可能性があるため、これは良いオプションです。
アドバイスや提案をいただければ幸いです - ありがとうございます。
編集:これまでの話...まだこれに苦労しています。
ドロップボックスの使用を詳細に調べました(およびSkyDriveなどの他のクラウドストレージプロバイダー)。これらのサービスは、個々のユーザーのストレージと対話するアプリケーションを提供することを中心に設計されているようです。すべてのユーザーがファイルを MY ドロップボックス フォルダーにアップロードできるようにしたかったのですが、共有はできませんでした (顧客は他の顧客のデザイン ファイルにアクセスできません)。とにかく、ドロップボックス アカウントをセットアップし、Sharpbox SDKをインストールして、アップロード コード (タスク アクション内のビット) を再プログラムしました。これは私のローカル マシンでは問題なく動作しているように見えましたが、ドロップボックス サーバーにアップロードしていたため、少し遅くなりました (Thread.Sleep は必要ありませんでした)。Web サイトを 123-Reg サーバーに公開したところ、以前と同様の使用不能なエクスペリエンスが得られました。
これまでは IE9 でテストしていましたが、たまたま Chrome で試してみたところ、面白いことに気付きました。アップロード ボタンをクリックした直後で、ページが更新される前に、Chrome の左下にアップロード % 完了ダイアログが表示されました。これが 100% まで実行された後、ページ全体が再びハングし始める前に、コントロールが何らかのアクションを表示し始めました。
MSDN によるとHttpPostedFile : 「デフォルトでは、フォーム フィールドやアップロードされたファイルを含む、256 KB を超えるすべてのリクエストがディスクにバッファリングされます」
これは、アップロードを待つという苦痛な部分 (クライアントとバッファの間で実際に発生している) の後に、タスクが開始されていることを意味しますか? この場合、ファイルをドロップボックスに送信して、より苦痛にするのは意味がありませんよね?そして、進行状況バーが間違ったビットの進行状況を追跡していますか?
(今日、コードがハングしている理由は、例外から適切に回復していないためだと感じているため、コードのエラー処理を確認します)。そうすることで、確かに多くのことを学んでいるように感じます。