c# - ASP.NET MVC 3を使用したSQL ServerへのFileUpload

原文 c# asp.net asp.net-mvc-3

現在、管理パネルを使用して画像を画像ギャラリーにアップロードし、その他のスキャンしたドキュメントをデータベースにアップロードするクライアント用のアプリケーションを開発しています。データベースに保存されたファイルを保存および取得するためのコントローラーアクションを正常に記述しました。

ファイルがデータベースにアップロードされているときに進行状況バーを表示する方法に行き詰まっています。 jQueryのuploadifyなど、いくつかのコントロールを試しました。それらはすべて、MS-SQLデータベースにアップロードしている間ではなく、ファイルをフォルダーに保存することに成功しています。

これが私のモデルのサンプルです:

    public Class myImages
    {
       [Key, Required]
       public string ImageID { get; set; }

       [Required, MaxLength(100), DisplayName("Image Title:")]
       public string ImageTitle { get; set; }

       [DisplayName("Image File:")]
       public byte[] ImageData { get; set; }
       public string ImageContentType { get; set; }
    }


アップロードしたファイルのバイト配列を返すための関数をインフラストラクチャに作成しました。これがコードです。

    public byte[] uploadedFileToByteArray(HttpPostedFileBase file)
    {
       int nFileLen = file.ContentLength;
       byte[] result = new byte[nFileLen];
       file.InputStream.Read(result, 0, nFileLen);
       return result;
    }


...そして、ここに作成の制御アクションがあります

    [HttpPost, ValidateInput(false), ValidateAntiForgeryToken]
    public ActionResult Create(myImage myimage)
    {
       if (ModelState.IsValid)
          {
             myimage.ImageID = DateTime.Now.Ticks.ToString();
             myimage.ImageData = uploadedFileToByteArray(Request.Files[0]);
             myimage.ImageContentType = Request.Files[0].ContentType;

             db.Pictures.Add(picture);
             db.SaveChanges();
             return RedirectToAction("Index");  
          }
      return View(picture);
    }


すでに述べたように、上記のコードは完全に正常に機能していますが、ファイルのアップロード中にプログレスバーが機能していないようです。それを行う方法のアイデアはありますか?

また、ファイルを一時フォルダーにアップロードし、そのファイルのバイトを読み取ってからSQL Serverにアップロードしようとしましたが、このアプローチは機能しますが、何らかの理由でクライアントがそれを望まず、この解決策にも満足していません。

ファイルをアップロードするときに、Googleのクロムがアップロードの割合を表示することにも気づきました。ブラウザがクライアント側のデータにアクセスできる場合、jQueryまたはAjaxを介してアップロード/送信されたバイトにアクセスし、アップロード中にプログレスバーを表示する方法があります。 ?

Visual Studio 2010、ASP.NET、MVC 3を使用しています。
答え
チャンクでメモリにバイトを読み取り、進行状況を測定するために使用しているアップロードプラグインがアクセスできるサーバー側の変数(セッションなど)で読み取られたデータの量を更新する必要があります。一度にすべてのデータを読み取るため、部分的な進捗状況を報告する方法はありません。別のアクションを使用して、これまでに読み取った進行状況インジケーターの量を報告します。これを機能させるには、非同期コントローラーの使用が必要になる場合があります。

これは単なるアイデアです。堅牢であったり、複数のファイルを処理したりするには、かなりの作業が必要になります。

public byte[] uploadedFileToByteArray(HttpPostedFileBase file)
{
   int nFileLen = file.ContentLength;
   int currentPosition = 0;
   byte[] result = new byte[nFileLen];
   Session["fileLen"] = nFileLen;
   int bytesRead = file.InputStream.Read(result,0,1000);
   while (bytesRead > 0)
   {
      currentPosition += bytesRead;
      Session["progress"] = currentPosition;
      bytesRead = file.InputStream.Read(result,currentPosition,1000);
   }
   return result;
}

public ActionResult ReportProgress()
{
     int nFileLen = (int)Session["fileLen"];
     int progress = (int)Session["progress"];

     return Json( new { Progress = (float)progress/nFileLen, Complete = nFileLen >= progress } );
}
関連記事

c# - MySQL変更テーブルのメモリ増加

c# - 2D整数配列への数値のリスト

c# - MSMQを介して通信するWindowsサービス-サービスバスは必要ですか?

c# - MVC3-html.helperでデータ属性を取得する

c# - 多くのアプリケーションにわたるプロジェクト参照の整合性

c# - LINQクエリ変数をDataTableに変換できません

c# - TraceOptions.Timestampを使用するときにTimestampデータをフォーマットする方法

c# - Mysqlデータソースをasp.netのデータグリッドビュー列にバインドする

c# - Excel VBAコード変換

c# - 最初にOracle用のdotconnectを使用して、EF 4.1コードで「schema.tablename」形式でPOCOをマッピングする