AntiForgeryToken не получен при использовании plupload в отправке формы - PullRequest
1 голос
/ 23 июля 2011

Я использую Plupload, чтобы разрешить загрузку нескольких изображений в веб-приложение mvc3.

загрузка файлов в порядке, но когда я представляю AntiForgeryToken, он не работает, и ошибка в том, что нетбыл предоставлен токен или он был недействительным.

Я также не могу получить параметр Id для принятия в качестве параметра действия, он всегда отправляет ноль.Поэтому я должен извлечь его сам из свойства Request.UrlReferrer вручную.

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

Моя форма ....

@using (@Html.BeginForm("Upload", "Photo", new { Model.Id }, FormMethod.Post, new { id = "formUpload", enctype = "multipart/form-data" }))
 {
    @Html.AntiForgeryToken()
    @Html.HiddenFor(m => m.Id)
    <div id="uploader">
        <p>You browser doesn't have HTML5, Flash or basic file upload support, so you wont be able to upload any photos - sorry.</p>
    </div>
    <p id="status"></p>
 }

и код, который его связывает ...

$(document).ready(function ()
{
    $("#uploader").plupload({
        // General settings
        runtimes: 'html5,flash,html4',
        url: '/Photo/Upload/',
        max_file_size: '8mb',
        //              chunk_size: '1mb',
        unique_names: true,

        // Resize images on clientside if we can
        resize: { width: 400, quality: 100 },

        // Specify what files to browse for
        filters: [
            { title: "Image files", extensions: "jpg,gif,png" }
        ],

        // Flash settings
        flash_swf_url: 'Content/plugins/plupload/js/plupload.flash.swf'
    });

    $("#uploader").bind('Error', function(up, err)
    {
        $('#status').append("<b>Error: " + err.code + ", Message: " + err.message + (err.file ? ", File: " + err.file.name : "") + "</b>");
    });


    // Client side form validation
    $('uploadForm').submit(function (e)
    {
        var uploader = $('#uploader').pluploadQueue();

        // Validate number of uploaded files
        if (uploader.total.uploaded == 0)
        {
            // Files in queue upload them first
            if (uploader.files.length > 0)
            {
                // When all files are uploaded submit form
                uploader.bind('UploadProgress', function ()
                {
                    if (uploader.total.uploaded == uploader.files.length)
                        $('form').submit();
                });

                uploader.start();
            } else
                alert('You must at least upload one file.');

            e.preventDefault();
        }
    });

});  

и вот действие контроллера, которое его получает ...

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Upload(int? id, HttpPostedFileBase file)
{
    if (file.ContentLength > 0)
    {
        var parts = Request.UrlReferrer.AbsolutePath.Split('/');
        var theId = parts[parts.Length - 1];
        var fileName = theId + "_" + Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
        file.SaveAs(path);
    }
    return Content("Success", "text/plain");
}

Asвы видите, мне пришлось сделать параметр id обнуляемым, и я извлекаю его вручную в методе действия.

Как я могу убедиться, что значения отправляются с каждым отправлением формы правильно?

Ответы [ 2 ]

2 голосов
/ 26 декабря 2015

краткий ответ: ДА!

использовать multipart_params опции, подобные этой:

multipart_params: 
{ 
__RequestVerificationToken: $("#modal-dialog input[name=__RequestVerificationToken]").val() 
}
1 голос
/ 02 августа 2011

короткий ответ: вы не можете.

В этом случае вы можете передать свой токен либо как другой многокомпонентный параметр (если он используется), либо как часть URL-адреса в качестве параметра GET, но ничего из формы не будет отправлено plupload какон создает свой собственный запрос.
Другая возможность - использовать пользовательские заголовки для передачи токена на сервер (у plupload есть опция headers), но какой бы метод вы ни использовали, вам придется обрабатывать его на своем бэкэнде.чтобы подтвердить это.

...