【问题标题】:How to use the plupload package with ASP.NET MVC?如何在 ASP.NET MVC 中使用 plupload 包?
【发布时间】:2011-05-25 14:27:58
【问题描述】:

我使用的是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
});

【问题讨论】:

  • 只是想知道为什么'multiple_queues'被声明了两次,但值相反? (错字?)
  • @Geovani Martinez:只是一个复制粘贴垃圾:)

标签: asp.net-mvc asp.net-mvc-2 plupload


【解决方案1】:

给你:

[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 作为操作参数,因为名称不确定。

【讨论】:

  • 小错误 - 第 7 行应该是名称而不是文件名
  • @Colin,感谢您指出这一点。我已经更新了我的答案。
  • 在我的实现中,我的控制器的 URL 和操作没有执行。以上如何工作,而我将我的指向我的相关“~/Document/Upload”发布操作,它甚至没有执行(断点未命中)。
  • SO 发表评论算法: 1. 尝试几天。感到沮丧。 2. 发表 SO 评论。希望。 3. 在 SO 评论发布后立即弄清楚。墨菲定律感谢达林
  • chunk == 0 ? FileMode.Create : FileMode.Append 如果 plupload 尝试影响块 0、1、1、2 的效果会发生什么(例如,它可能没有得到对块 1 的响应并再次尝试)。假设 plupload 永远不会这样做(现在或将来)CreateAppend 之间的区别是什么? Appenddocumented thus如果文件存在则打开文件并查找文件末尾,或者创建一个新文件
【解决方案2】:

看这里:

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

就是这样……Controller中不需要任何块……

【讨论】:

  • 除非图像尺寸非常小,否则它不会起作用 - 因为,我猜,只有第一个块被保存,如果图像大于它,它将无法正确保存。
  • No chunk is needed in Controller !!如何? plupload 会将块发送到每个块的操作。所以每个块都会覆盖前一个块。我说的对吗?
  • 如果文件大于 1mb,则需要分块。 .NET 将抛出 Maximum request length exceeded.
  • 这是不正确的,测试一个大于你的 Plupload 块大小设置的文件,你会看到你的控制器方法对每个块多次
猜你喜欢
  • 2011-08-16
  • 2017-01-02
  • 2011-09-18
  • 2014-06-10
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2011-02-12
  • 2013-12-17
相关资源
最近更新 更多