2010-09-24 4 views
8

Я пытаюсь загрузить Uploadify для работы с моим сайтом, но я получаю общую «HTTP-ошибку» даже до отправки файла на сервер (я говорю это, потому что Fiddler делает не показывать никаких сообщений на мой контроллерПолучение загрузки для работы с asp.net-mvc

Я могу правильно просматривать файл для загрузки. В очереди правильно загружен файл для загрузки, но когда я нажимаю кнопку отправки, элемент в очереди получает красный цвет и сказать HTTP Error

в любом случае это мой частичный код:.

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

Большое спасибо за помощь!

UPDATE:

Я добавил «OnError» обработчик к Uploadify сценария для изучения которой ошибка происходит, как в следующем примере

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

и обнаружил, что информация свойство содержит . Я также добавил параметр «method», чтобы добавить значение «сообщение».

Включаю код действия контроллера для информации. Я прочитал много сообщений о uloadify, и кажется, что я могу использовать действие со следующей подписью ...

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

Может кто-нибудь предоставить некоторую помощь, пожалуйста?

+0

Нет шансов получить помощь по этому вопросу?:( – Lorenzo

ответ

7

Молодцы и проблемы исчезли!

Не было проблем с моим кодом. Использование плагина, как правило, было правильным, но возникла проблема с механизмом аутентификации.

Как все могут найти в Интернете, плагин Flash не передает cookie аутентификации с кодом на стороне сервера, и это стало причиной использования раздела «scriptData» внутри моего кода, содержащего Cookie Authentication.

Проблема была связана с тем, что контроллер был украшен атрибутом [Авторизоваться], и это никогда не позволяло запросу достичь цели.

Решение, найденное с помощью другого пользователя в форуме uploadify, заключается в написании настраиваемой версии AuthorizeAttribute, как вы можете видеть в следующем коде.

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

Используя это, чтобы украсить контроллер/действие, которое делает загрузку, сделало все, чтобы работать плавно.

Единственная странная вещь, которая остается нерешенной, но не влияет на выполнение кода, заключается в том, что, как ни странно, Fiddler не показывает HTTP-сообщение. Я не понимаю, почему ....

Я публикую это, чтобы сделать его доступным для сообщества.

спасибо!

+0

Значит, это означает, что неавторизованные пользователи могут загружать файлы? –

+0

Да. Если вы не используете такой код – Lorenzo

+2

Сообщение, которое не отображается в Fiddler, связано с тем, что вам нужно использовать ipv4.fiddler как домен вместо localhost. –

Смежные вопросы