Как использовать пакет plupload с ASP.NET MVC?

Я использую plupload версии 1.3.0.

В частности, как мне определить действие моего контроллера для поддержки фрагментации? Могу ли я использовать HttpPosteFileBase в качестве параметра?

На данный момент я использую следующий код для инициализации плагина

В теге HEAD

<link type="text/css" rel="Stylesheet" media="screen" href="<%: Url.Content( "~/_assets/css/plupload/jquery.ui.plupload.css" )%>" />
<link type="text/css" rel="Stylesheet" media="screen" href="<%: Url.Content( "~/_assets/css/plupload/gsl.plupload.css" )%>" />
<script type="text/javascript" src="<%: Url.Content( "~/_assets/js/plupload/gears_init.js" )%>"></script>
<script type="text/javascript" src="<%: Url.Content( "~/_assets/js/plupload/plupload.full.min.js" )%>"></script>
<script type="text/javascript" src="<%: Url.Content( "~/_assets/js/plupload/jquery.ui.plupload.min.js" )%>"></script>

Готовый документ

$("#uploader").pluploadQueue({
    runtimes: 'html5,html4,gears,flash,silverlight',
    url: '<%: Url.Content( "~/Document/Upload" ) %>',
    max_file_size: '5mb',
    chunk_size: '1mb',
    unique_names: true,
    filters: [
        { title: "Documenti e Immagini", extensions: "doc,docx,xls,xlsx,pdf,jpg,png" }
    ],
    multiple_queues: false
});

person Lorenzo    schedule 14.12.2010    source источник
comment
Просто интересно, почему «multiple_queues» объявляется дважды с противоположными значениями? (опечатка?)   -  person Geovani Martinez    schedule 28.06.2011
comment
@Geovani Martinez: просто отказ от копирования и вставки :)   -  person Lorenzo    schedule 28.06.2011


Ответы (2)


Ну вот:

[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 Content("chunk uploaded", "text/plain");
}

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

person Darin Dimitrov    schedule 15.12.2010
comment
Небольшая ошибка - строка 7 должна быть именем, а не именем файла - person Colin Asquith; 02.02.2011
comment
@Колин, спасибо, что указали на это. Я обновил свой ответ. - person Darin Dimitrov; 02.02.2011
comment
В моей реализации URL-адрес моего контроллера и действие не выполняются. Как это может работать, тогда как я указываю на свое соответствующее действие ~/Document/Upload, и оно даже не выполняется (точка останова не срабатывает). - person Forer; 12.10.2011
comment
SO Размещение комментариев Алгоритм: 1. Попробуйте что-нибудь в течение нескольких дней. Разочароваться. 2. Опубликовать ТАК комментарий. Надеясь. 3. Выясните это сразу после публикации SO Comment. Закон Мерфи Спасибо Дарин - person Forer; 12.10.2011
comment
chunk == 0 ? FileMode.Create : FileMode.Append Что произойдет, если plupload попытается что-то сделать с эффектом чанка 0, 1, 1, 2 (например, возможно, он не получил ответа на чанк 1 и попытается снова). Предполагая, что plupload никогда не сделает этого (сейчас или в будущем), что дает различие между Create и Append? Append задокументировано таким образом: Открывает файл, если он существует, и выполняет поиск в конец файла или создает новый файл - person ta.speot.is; 08.12.2014

Смотри сюда:

$("#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!";
       }

Вот и все... В контроллере не нужен чанк...

person Snake Eyes    schedule 29.12.2011
comment
Это не сработает, если размер изображения не очень маленький - потому что, я думаю, сохраняется только первый фрагмент, и если изображение больше этого, оно не будет сохранено должным образом. - person Miha Markic; 16.11.2012
comment
No chunk is needed in Controller !! Как? plupload отправит блок в действие для каждого блока. поэтому каждый фрагмент будет перезаписывать предыдущий. Я прав? - person Mahmood Dehghan; 01.10.2013
comment
Фрагментирование необходимо, если файл больше 1 мб. .NET выдаст Maximum request length exceeded. - person Piotr Kula; 15.05.2014
comment
Это неверно, проверьте файл, размер которого больше, чем установленный вами размер фрагмента Plupload, вы увидите свой метод контроллера несколько раз для каждого фрагмента. - person Brian Ogden; 27.06.2016