2010-09-24 15 views
8

Ich versuche, zu erhalten, um mit meiner Website zu arbeiten, aber ich bekomme einen generischen "HTTP-Fehler", noch bevor die Datei an den Server gesendet wird (ich sage dies, weil Fiddler tut keine Post-Anfrage an meinen ControllerGetting Uploadify zu arbeiten mit asp.net-mvc

Ich kann korrekt nach der Datei zum Hochladen suchen.Die Warteschlange ist korrekt mit der Datei zum Hochladen gefüllt, aber wenn ich auf die Schaltfläche "Senden" klicke, wird das Element in der Warteschlange rot angezeigt und sagen HTTP-Fehler

Wie auch immer das ist mein Teil-Code:.

<% using (Html.BeginForm("Upload", "Document", FormMethod.Post, new { enctype = "multipart/form-data" })) { %> 
<link type="text/css" rel="Stylesheet" media="screen" href="/_assets/css/uploadify/uploadify.css" /> 
<script type="text/javascript" src="/_assets/js/uploadify/swfobject.js"></script> 
<script type="text/javascript" src="/_assets/js/uploadify/jquery.uploadify.v2.1.0.min.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 

     $("[ID$=uploadTabs]").tabs(); 

     var auth = "<% = Request.Cookies[FormsAuthentication.FormsCookieName]==null ? string.Empty : Request.Cookies[FormsAuthentication.FormsCookieName].Value %>"; 
     $('#fileInput').uploadify({ 
      uploader: '/_assets/swf/uploadify.swf', 
      script: '/Document/Upload', 
      folder: '/_uploads', 
      cancelImg: '/_assets/images/cancel.png', 
      auto: false, 
      multi: false, 
      scriptData: { token: auth }, 
      fileDesc: 'Any document type', 
      fileExt: '*.doc;*.docx;*.xls;*.xlsx;*.pdf', 
      sizeLimit: 5000000, 
      scriptAccess: 'always', //testing locally. comment before deploy 
      buttonText: 'Browse...' 
     }); 

     $("#btnSave").button().click(function(event) { 
      event.preventDefault(); 
      $('#fileInput').uploadifyUpload(); 
     }); 

    }); 
</script> 
    <div id="uploadTabs"> 
     <ul> 
      <li><a href="#u-tabs-1">Upload file</a></li> 
     </ul> 
     <div id="u-tabs-1"> 
      <div> 
      <input id="fileInput" name="fileInput" type="file" /> 
      </div> 
      <div style="text-align:right;padding:20px 0px 0px 0px;"> 
       <input type="submit" id="btnSave" value="Upload file" /> 
      </div> 
     </div> 
    </div> 
<% } %> 

Vielen Dank für Ihre Hilfe!

UPDATE:

Ich habe einen „onError“ Handler zum Uploadify Skript hinzugefügt, um zu erkunden, welche Fehler wurde wie im folgenden Beispiel

onError: function(event, queueID, fileObj, errorObj) { 
    alert("Error!!! Type: [" + errorObj.type + "] Info [" + errorObj.info + "]"); 
} 

und entdeckt passiert, dass die Informationen Eigenschaft enthält . Ich habe auch die "Methode" Parameter hinzugefügt, um mit dem Wert von "post" zu laden.

Ich schließe meinen Controller Action Code für Informationen ein. Ich habe viele Beiträge über uloadify gelesen und es scheint, dass ich eine Aktion mit der folgenden Signatur verwenden können ...

[HttpPost] 
public ActionResult Upload(string token, HttpPostedFileBase fileData) { 
    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(token); 
    if (ticket!=null) { 
     var identity = new FormsIdentity(ticket); 
     if(identity.IsAuthenticated) { 
      try { 
       //Save file and other code removed 
       return Content("File uploaded successfully!"); 
      } 
      catch (Exception ex) { 
       return Content("Error uploading file: " + ex.Message); 
      } 
     } 
    } 
    throw new InvalidOperationException("The user is not authenticated."); 
} 

Kann jemand etwas Hilfe geben Sie bitte?

+0

keine Chance, Hilfe dabei zu bekommen?:( – Lorenzo

Antwort

7

Gut gemacht und das Problem ist vorbei!

Es gab nicht "richtig" ein Problem mit meinem Code. Die Verwendung des Plugins war im Allgemeinen korrekt, aber es gab ein Problem mit dem Authentifizierungsmechanismus.

Wie jeder im Internet finden kann, teilt das Flash-Plugin das Authentifizierungs-Cookie nicht mit dem serverseitigen Code und dies war der Grund für die Verwendung des Abschnitts "scriptData" in meinem Code, der das Authentifizierungs-Cookie enthielt.

Das Problem hing mit der Tatsache zusammen, dass der Controller mit dem [Authorize] -Attribut ausgestattet war und die Anfrage nie an ihr Ziel gelangen konnte.

Die Lösung, die mit Hilfe eines anderen Benutzers im uploadify-Forum gefunden wurde, besteht darin, eine angepasste Version des AuthorizeAttribute zu schreiben, wie Sie im folgenden Code sehen können.

/// <summary> 
/// A custom version of the <see cref="AuthorizeAttribute"/> that supports working 
/// around a cookie/session bug in Flash. 
/// </summary> 
/// <remarks> 
/// Details of the bug and workaround can be found on this blog: 
/// http://geekswithblogs.net/apopovsky/archive/2009/05/06/working-around-flash-cookie-bug-in-asp.net-mvc.aspx 
/// </remarks> 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
public class TokenizedAuthorizeAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// The key to the authentication token that should be submitted somewhere in the request. 
    /// </summary> 
    private const string TOKEN_KEY = "AuthenticationToken"; 

    /// <summary> 
    /// This changes the behavior of AuthorizeCore so that it will only authorize 
    /// users if a valid token is submitted with the request. 
    /// </summary> 
    /// <param name="httpContext"></param> 
    /// <returns></returns> 
    protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) { 
     string token = httpContext.Request.Params[TOKEN_KEY]; 

     if (token != null) { 
      FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(token); 

      if (ticket != null) { 
       FormsIdentity identity = new FormsIdentity(ticket); 
       string[] roles = System.Web.Security.Roles.GetRolesForUser(identity.Name); 
       GenericPrincipal principal = new GenericPrincipal(identity, roles); 
       httpContext.User = principal; 
      } 
     } 

     return base.AuthorizeCore(httpContext); 
    } 
} 

Verwenden Sie dies, um die Controller/Aktion, die den Upload macht alles reibungslos funktioniert zu dekorieren.

Die einzige seltsame Sache, die ungelöst bleibt, aber die Ausführung des Codes nicht beeinträchtigt, ist, dass Fiddler den HTTP-Post seltsamerweise nicht anzeigt. Ich verstehe nicht warum ....

Ich poste dies, um es der Gemeinschaft zur Verfügung zu stellen.

danke!

+0

Also bedeutet dies, dass nicht autorisierte Benutzer Dateien hochladen können? –

+0

Ja. Wenn Sie nicht Code wie diesem verwenden. – Lorenzo

+2

Der Beitrag, der nicht in Fiddler angezeigt wird, ist, weil Sie anstelle von localhost ipv4.fiddler als Domäne verwenden müssen. –