Получение Uploadify для работы с asp.net-mvc - PullRequest
8 голосов
/ 25 сентября 2010

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

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

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

и обнаружил, что свойство info содержит 302 . Я также добавил параметр "method" для загрузки со значением 'post' .

Я включаю мой код действия контроллера для информации. Я прочитал много постов, касающихся 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.");
}

Кто-нибудь может помочь, пожалуйста?

1 Ответ

7 голосов
/ 28 сентября 2010

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

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

Как все могут найти в Интернете, флэш-плагин не делит куки-файл аутентификации с кодом на стороне сервера, и это было причиной использования раздела «scriptData» внутри моего кода, который содержал куки-файл аутентификации. *

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

Решение, найденное с помощью другого пользователя на форуме 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. Я не понимаю почему ....

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

спасибо!

...