Почему у меня не работает загрузка файлов в Firefox или Chrome? - PullRequest
0 голосов
/ 14 января 2011

Я пытаюсь выполнить простую загрузку файлов из моего веб-приложения ASP.NET MVC с помощью uploadify. В IE8 все работает нормально. В Firefox и Chrome кажется, что он никогда не публикует действия контроллера. Может кто-нибудь помочь мне понять, что я делаю не так?

Вот мой HTML:

<input type="file" id="file_upload" name="FileData" />

Я включаю jquery 1.4.1 и содержимое текущей версии uploadify 2.1.4, которая сама включает swfobject 2.2.

Вот мой сценарий:

$ (function () {

$("#file_upload").uploadify({
  'uploader':   '/Scripts/uploadify.swf',
  'script':     '/Uploads/UploadFile',
  'cancelImg':  '/Content/Images/cancel.png',
  'auto':       true,
  'multi':      false,
  'folder':     '/uploads',

  onComplete : function() {
    alert("complete");
  },

  onOpen : function() {
    alert("open");
  },

  onError : function (event, id, fileObj, errorObj) {
    alert("error: " + errorObj.info);
  }

});

});

А вот мое действие контроллера:

public string UploadFile(HttpPostedFileBase FileData)
{
    // do stuff with the file
}

В Chrome и Firefox я получаю сообщение «Ошибка # 2038», которое кажется довольно загадочным из того, что я могу найти в Google. Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Что попробовать:

  1. Действие вашего контроллера должно возвращать ActionResult, а не строку
  2. Установить Fiddler и посмотреть, что происходит под крышками (вы увидитефреймы HTTP-запроса / ответа и возможная ошибка).Затем сравните результаты между различными браузерами, чтобы увидеть, если что-то изменится.
0 голосов
/ 14 декабря 2011

Как сказал Крис Фармер, сеанс отличается во флэш-запросе, файлы cookie .ASPXAUTH (или другие файлы cookie сеанса) не отправляются в Chrome и Firefox (это можно посмотреть с помощью Fiddler2)

Чтобы решить эту проблему, вы можете использовать «scriptData» с uploadify. Вот как я продолжаю:

Добавьте это в свою загрузку js:

string scriptDataValues = string.Empty;
            if (Request.Cookies != null && Request.Cookies.Length > 0)
            {
                //  Generate scriptData
                scriptDataValues = ", 'scriptData' : {";
                string[] formatedData = new string[Request.Cookies.Length];
                int i = 0;
                foreach (HttpCookie cookie in cookies)
                {
                    // Format cookie to scriptData name:value
                    formatedData[i] = string.Format("\"{0}\":\"{1}\"", cookie.Name, cookie.Value);
                    i++;
                }
                // separate all formated cookies with comma
                scriptDataValues += string.Join(",", formatedData);
                scriptDataValues += "}";
            }
     // add scriptData to your js script
    string yourScript = "<script type=\"text/javascript\">
$(document).ready(function () { $('#file_upload').uploadify({
      'uploader'    : '/uploadify/uploadify.swf',
      'script'      : '/uploadify/uploadify.php',
      'cancelImg'   : '/uploadify/cancel.png',
      'folder'      : '/uploads'
      " + scriptDataValues + "
    }); }); 
</script>"

А в ваших действиях в вашем контроллере:

[HttpPost]
        public ActionResult UploadProductImage(HttpPostedFileBase image, FormCollection collec)
        {
            Partner partner = null;
            if (!string.IsNullOrEmpty(collec[".ASPXAUTH"]))
            {
                // Get cookie in POST values
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(collec[".ASPXAUTH"]);
                if (ticket.Expiration > DateTime.Now)
                {
                     // Authenticated user, upload the file and return url
                }
             }
        return this.Content(string.Empty);
        }
...