2010-09-24 14 views
8

Estoy intentando que Uploadify trabaje con mi sitio, pero obtengo un "HTTP Error" genérico incluso antes de que el archivo se envíe al servidor (digo esto porque Fiddler sí no mostrar ninguna solicitud posterior a mi controladorCómo hacer que Uploadify funcione con asp.net-mvc

Puedo buscar correctamente el archivo a cargar. La cola está correctamente llena con el archivo para cargar, pero cuando presiono el botón de enviar el elemento en la cola obtiene un color rojo y decir HTTP Error

De todos modos este es mi código parcial:.

<% 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> 
<% } %> 

¡Muchas gracias por ayudarme!

ACTUALIZACIÓN:

he añadido un "onError" manejador al guión uploadify para explorar la cual el error que ocurría como en el siguiente ejemplo de

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

y descubrió que la propiedad de información contiene . También he agregado el "método" parámetro para cargar con el valor de 'publicación'.

Estoy incluyendo mi código de acción de controlador para más información. He leído muchos puestos con respecto uloadify y parece que puedo usar una acción con la siguiente firma ...

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

¿Alguien puede proporcionar alguna ayuda por favor?

+0

no hay posibilidades de obtener ayuda sobre esto?:( – Lorenzo

Respuesta

7

¡Bien hecho y problema!

No hubo un problema "propiamente" con mi código. El uso del complemento generalmente era correcto, pero existía un problema con el mecanismo de autenticación.

Como todo el mundo se puede encontrar en Internet el plugin flash no comparte la cookie de autenticación con el código del lado del servidor y esta fue la razón detrás del uso de la sección "scriptData" dentro de mi código que contiene la cookie de autenticación.

El problema estaba relacionado con el hecho de que el controlador estaba decorado con el atributo [Autorizar] y esto nunca dejaba que la solicitud llegara a su destino.

La solución, encontrada con la ayuda de otro usuario en el foro de carga, es escribir una versión personalizada de AuthorizeAttribute como se puede ver en el siguiente código.

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

Usando esto para decorar el controlador/acción que hace la carga, todo funcionó sin problemas.

Lo único extraño que permanece sin resolver, pero no afecta la ejecución del código, es que, curiosamente, Fiddler no muestra la publicación HTTP. No entiendo por qué ...

Estoy publicando esto para que esté disponible para la comunidad.

gracias!

+0

¿Significa esto que los usuarios no autorizados pueden cargar archivos? –

+0

Sí. Si no utiliza un código como este – Lorenzo

+2

La publicación que no aparece en Fiddler se debe a que necesita usar ipv4.fiddler como dominio en lugar de localhost. –

Cuestiones relacionadas