2011-01-14 3 views
0

Ich versuche, einen einfachen Datei-Upload von meiner ASP.NET MVC-Web-App mithilfe von Uploadify durchzuführen. In IE8 funktioniert es gut. In Firefox und Chrome scheint es nie auf die Controller-Aktion zu posten. Kann mir jemand helfen zu finden, was ich falsch mache?Warum funktioniert das Hochladen für mich nicht in Firefox oder Chrome?

Hier ist mein html:

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

ich darunter bin jquery 1.4.1 und die Inhalte der aktuellen Version von Uploadify 2.1.4, die sich swfobject 2.2 enthält.

Hier ist mein Skript:

$ (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); 
    } 

}); 

});

Und hier ist meine Controller-Aktion:

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

In Chrome und Firefox, erhalte ich eine "Error # 2038" Nachricht, die von ziemlich kryptisch scheint, was ich auf der Google finden kann. Was mache ich falsch?

+0

Wann und wo bekommt man die Fehlermeldung? –

+0

Die Fehlermeldung ist nur in der errorObj im OnError Callback. –

Antwort

3

Dinge versuchen:

  1. Ihre Controller-Aktion sollte Action zurückkehren, nicht Zeichenfolge
  2. Fiddler installieren und sehen, was unter der Decke geschieht (Sie werden das HTTP-Request/Response-Frames und einen möglichen Fehler sehen) . Vergleichen Sie dann die Ergebnisse zwischen den verschiedenen Browsern, um zu sehen, ob sich etwas ändert.
+1

Danke ... Ich hatte früher versucht, Fiddler zu benutzen, aber ich habe nie bemerkt, dass der Post zurück zum Controller kam. Nachdem ich gelesen habe, wie man Fiddler dazu bringt, localhost-Anfragen zu protokollieren, wurde klar, dass dies eine Authentifizierungs-Sache war, da die ASP.NET-Sitzung in der Flash-Anfrage anders ist als in meinen standardmäßigen browserbasierten Anfragen. Vielen Dank! –

+0

Wie hast du das behoben? Ich habe das gleiche Problem, funktioniert mein Code mit IE aber nicht mit Firefox und Chrome? –

+0

Können Sie bitte die Lösung posten, wie Sie dies behoben haben .. wird wirklich nützlich sein für alle, die ähnliche Probleme haben. – ZVenue

0

Wie Chris Farmer sagte, Sitzung im Flash-Anforderung ist anders, Cookies .ASPXAUTH (oder einer anderen Session-Cookie) werden nicht in Chrome und Firefox gesendet (Sie dies mit Fiddler2 sehen können)

zu lösen Bei diesem Problem können Sie "scriptData" mit uploadify verwenden. Dies ist, wie ich vorgehen:

Fügen Sie diese auf Ihre 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>" 

Und in Ihrer Aktion in Ihrem Controller:

[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); 
     }