DropZone.js使用ASP.Net MVC上传多个文件

时间:2015-06-26 18:17:06

标签: javascript asp.net asp.net-mvc asp.net-mvc-4 dropzone.js

我正在使用javascript库DropZone.js但是上传多个文件在某种程度上无法与ASP.Net MVC一起使用。

有效的方法是我设置Dropzone选项" autoProcessQueue:true"和MVC Controller参数名称" inputFiles"可以看到输入文件成功上传到服务器。但是,这意味着图像的上传会自动发生,用户无法单击表单提交按钮。 (我认为这就是为什么他们称之为DROPZone - 自动上传)

无论如何,我想让用户在上传之前点击提交按钮,所以我设置选项" autoProcessQueue:false",但在表单上提交参数名称" inputFiles"在Controller总是返回null。

        <form action="/home" method="post" enctype="multipart/form-data" class="dropzone dz-clickable form-horizontal form-bordered" id="dropzoneForm">
            <div class="form-group form-actions">
                <div class="col-md-9 col-md-offset-4">
                    <button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-floppy-o"></i> Upload</button>
                </div>
            </div>
        </form>

<script>
    $(function () {
        Dropzone.options.dropzoneForm = {
            paramName: "inputFiles", // The name that will be used to transfer the file
            autoProcessQueue: true,
            uploadMultiple: false,
            parallelUploads: 100,
            accept: function (file, done) {
                done();
            }
        };
    });
</script>



[HttpPost]
    public ActionResult Index(IEnumerable<HttpPostedFileBase> inputFiles)
    {
        string fName = "";

        foreach (HttpPostedFileBase fileName in inputFiles)
        {
            HttpPostedFileBase file = fileName;
            //Save file content goes here
            fName = file.FileName;
            if (file != null && file.ContentLength > 0)
            {

                var originalDirectory = new DirectoryInfo(string.Format("{0}Images\\WallImages", Server.MapPath(@"\")));

                string pathString = System.IO.Path.Combine(originalDirectory.ToString(), "imagepath");

                var fileName1 = Path.GetFileName(file.FileName);

                bool isExists = System.IO.Directory.Exists(pathString);

                if (!isExists)
                    System.IO.Directory.CreateDirectory(pathString);

                var path = string.Format("{0}\\{1}", pathString, file.FileName);
                file.SaveAs(path);
            }

        } 

        return View();
    }

有人试过使用DropZone.js吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下命令代替在操作中使用参数:

[HttpPost]
public ActionResult Index()
{
    string fName = "";

    foreach (var fileName in Request.Files.AllKeys)
    {
        var file = Request.Files[fileName];
        //Save file content goes here
        fName = file.FileName;
        if (file != null && file.ContentLength > 0)
        {

            var originalDirectory = new DirectoryInfo(string.Format("{0}Images\\WallImages", Server.MapPath(@"\")));

            string pathString = System.IO.Path.Combine(originalDirectory.ToString(), "imagepath");

            var fileName1 = Path.GetFileName(file.FileName);

            bool isExists = System.IO.Directory.Exists(pathString);

            if (!isExists)
                System.IO.Directory.CreateDirectory(pathString);

            var path = string.Format("{0}\\{1}", pathString, file.FileName);
            file.SaveAs(path);
        }

    } 

    return View();
}

依此类推......不确定它是否有效..不能尝试,但这个想法很有用

Request.Files

希望这有帮助!

答案 1 :(得分:0)

Paul Sanchez&#39;解决方案指出它,永远不会工作!! 根据Dropzone.js文件,它说:

&#34; 如果将autoProcessQueue设置为false,则永远不会隐式调用.processQueue()。这意味着当您想要上传当前排队的所有文件时,您必须自己调用它。 &#34;

在您的情况下,因为在使用&#34; autoProcessQueue:false&#34;禁用自动进程后,您从未在客户端调用.processQueue(),dropzone.js永远不会处理文件,因此inputFiles参数将是空。

我描述了如何阻止自动进程队列,并随时在表单上提交以下帖子:

  

https://stackoverflow.com/a/33880338/5208058