Использование plupload с MVC3 - PullRequest
8 голосов
/ 23 мая 2011

Итак, я реализовал plupload, используя Flash Runtime в MVC3.

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

Я пытался переопределить fileUploaded, но я не могу ничего извлечь из аргументов. Я пытался вернуть простые строки, JSON и что у тебя. Я не могу ничего выдать на стороне клиента. И, конечно, при отправке через flash я даже не могу отлаживать запросы с помощью firebug: /

То же самое с событием Error и выдачей исключений. Это правильно интерпретирует исключение как ошибку, но это всегда ошибка #IO с каким-то кодом, например 2038, или с чем-то другим. Я не могу показать свою строку исключения или что-либо вообще. Кто-нибудь может помочь?

Бонусный вопрос: как бы я отправлял данные сеанса / куки вместе с загрузкой, чтобы я мог получить доступ к сеансу в своем действии?

Ответы [ 2 ]

13 голосов
/ 23 мая 2011

У меня сработало следующее:

[HttpPost]
public ActionResult Upload(int? chunk, string name)
{
    var fileUpload = Request.Files[0];
    var uploadPath = Server.MapPath("~/App_Data");
    chunk = chunk ?? 0;
    using (var fs = new FileStream(Path.Combine(uploadPath, name), chunk == 0 ? FileMode.Create : FileMode.Append))
    {
        var buffer = new byte[fileUpload.InputStream.Length];
        fileUpload.InputStream.Read(buffer, 0, buffer.Length);
        fs.Write(buffer, 0, buffer.Length);
    }
    return Json(new { message = "chunk uploaded", name = name });
}

и на клиенте:

$('#uploader').pluploadQueue({
    runtimes: 'html5,flash',
    url: '@Url.Action("Upload")',
    max_file_size: '5mb',
    chunk_size: '1mb',
    unique_names: true,
    multiple_queues: false,
    preinit: function (uploader) {
        uploader.bind('FileUploaded', function (up, file, data) {
            // here file will contain interesting properties like 
            // id, loaded, name, percent, size, status, target_name, ...
            // data.response will contain the server response
        });
    }
});

Что касается вопроса о бонусе, я хочу ответить на него, не используя сессии, поскольку они плохо масштабируются, но, поскольку я знаю, что вам, вероятно, не понравится этот ответ, у вас есть возможность передать идентификатор сеанса в запросе, используя multipart_params:

multipart_params: {
    ASPSESSID: '@Session.SessionID'
},

и затем на сервере выполнить несколько хаков , чтобы создать надлежащий сеанс.

5 голосов
/ 29 декабря 2011

Смотрите здесь:

$("#uploader").pluploadQueue({
         // General settings
         runtimes: 'silverlight',
         url: '/Home/Upload',
         max_file_size: '10mb',
         chunk_size: '1mb',
         unique_names: true,
         multiple_queues: false,

         // Resize images on clientside if we can
         resize: { width: 320, height: 240, quality: 90 },

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

         // Silverlight settings
         silverlight_xap_url: '../../../Scripts/upload/plupload.silverlight.xap'
      });

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

         // Files in queue upload them first
         if (uploader.files.length > 0) {
            // When all files are uploaded submit form
            uploader.bind('StateChanged', function () {
               if (uploader.files.length === (uploader.total.uploaded + uploader.total.failed)) {
                  $('form')[0].submit();
               }
            });

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

         return false;
      });

А в контроллере:

[HttpPost]
public string Upload(  ) {
          HttpPostedFileBase FileData = Request.Files[0];

          if ( FileData.ContentLength > 0 ) {
             var fileName = Path.GetFileName( FileData.FileName );
             var path = Path.Combine( Server.MapPath( "~/Content" ), fileName );
             FileData.SaveAs( path );
          }

          return "Files was uploaded successfully!";
       }

Это все ... Блок не нужен в контроллере ...

...