Почему у меня не работает uploadify в Firefox или Chrome?

Я пытаюсь выполнить простую загрузку файла из моего веб-приложения 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.

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

$(функция () {

$("#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. Что я делаю неправильно?


person Chris Farmer    schedule 14.01.2011    source источник
comment
Когда и где вы получаете сообщение об ошибке?   -  person Pekka    schedule 14.01.2011
comment
Сообщение об ошибке находится только в errorObj в обратном вызове onError.   -  person Chris Farmer    schedule 14.01.2011


Ответы (2)


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

  1. Действие вашего контроллера должно возвращать ActionResult, а не строку
  2. Установите Fiddler и посмотрите, что происходит внутри (вы увидите кадры HTTP-запроса/ответа и возможный ошибка). Затем сравните результаты между разными браузерами, чтобы увидеть, изменилось ли что-то.
person Darin Dimitrov    schedule 14.01.2011
comment
Спасибо... Раньше я пытался использовать fiddler, чтобы увидеть это, но я так и не заметил сообщение обратно в контроллер. После того, как я прочитал о том, как заставить fiddler регистрировать запросы локального хоста, стало ясно, что это было связано с аутентификацией, поскольку сеанс ASP.NET во флэш-запросе отличается от моего стандартного запроса на основе браузера. Спасибо! - person Chris Farmer; 14.01.2011
comment
Как вы это исправили? У меня такая же проблема, мой код работает с IE, но не с Firefox и Chrome? - person Ghazanfar Mir; 15.09.2011
comment
Не могли бы вы опубликовать решение о том, как вы это исправили .. будет действительно полезно для всех, у кого есть подобные проблемы. - person ZVenue; 26.09.2012

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

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

Добавьте это в свой 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);
        }
person PierrickM    schedule 14.12.2011