Загрузка файла на SQL Server с использованием ASP.NET MVC 3 - PullRequest
2 голосов
/ 09 октября 2011

В настоящее время я разрабатываю приложение для клиента, которое будет использовать панель администрирования для загрузки изображений в галерею изображений и некоторых других отсканированных документов в базу данных. Я успешно написал действие контроллера для сохранения и получения файлов, сохраненных в базе данных.

Теперь я застрял на том, как отображать индикатор выполнения при загрузке файла в базу данных. Я пробовал несколько элементов управления, таких как 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 Chrome показывает процент загрузки, если браузер может получить доступ к данным на стороне клиента, есть ли способ доступа к загруженным / отправленным байтам через jQuery или Ajax для отображения прогресса бар при загрузке?

Я использую Visual Studio 2010, ASP.NET, MVC 3.

1 Ответ

2 голосов
/ 09 октября 2011

Вам необходимо считывать байты в память порциями, обновляя объем данных, считанных в некоторой серверной переменной (возможно, в сеансе), к которой может обращаться плагин загрузки, который вы используете для измерения прогресса. Поскольку вы читаете все данные за один раз, и нет возможности сообщить о частичном прогрессе. Используйте другое действие, чтобы сообщить сумму, прочитанную до сих пор для индикатора прогресса. Обратите внимание, что вам может понадобиться использовать асинхронный контроллер для этой работы.

Обратите внимание, это только для идеи. Требуется немало усилий, чтобы быть надежным, обрабатывать несколько файлов и т. Д.

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 } );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...