首页 > 解决方案 > 通过webkit目录html输入上传多个文件后,将文件上传到服务器后无法从客户端删除文件

问题描述

我正在使用带有 webkitdirectory 的 html 输入上传目录。我将文件以表格形式发送到 .net 控制器以解析数据并将其存储到数据库。整个过程运行良好,但是,在您上传文件后,您将无法再从本地计算机中删除该文件,直到您关闭 google chrome 实例(运行应用程序的位置)。

我无法弄清楚为什么会这样。我尝试处理所有上传的文件,关闭所有文件。我什至删除了所有的文件读取逻辑,只是让前端点击控制器上传方法,对文件什么都不做。

我下载了 Process Explorer 以查看发生了什么,这是我发现的:

当控制器被击中时,chrome为目录中的每个文件创建了2个进程(我不知道为什么要创建3个)。该方法运行完成后,每个上传的文件都有一个进程运行。由于上传后有文件正在运行,因此在我的本地计算机上我无法删除或重命名文件,但是由于某种原因我可以对其进行编辑。

我知道 httpPostedFileBase 也包含在来自 ajax 请求的 Request.Files 中,我不确定这是否是问题,因为我还将文件传递到视图模型中。我什至拿出了视图模型,只处理了 Request.Files 中的文件,但仍然遇到同样的问题。

我遇到了一个与我的问题类似的帖子,但没有真正的解决方案或解决他们的问题。[在这里发布][https://stackoverflow.com/questions/717878/cant-delete-a-file-from-a-client-after-uploading-it-to-the-server]

$("input:file").change(function () {

        var allFiles = $('input[name="allFilesInput"]').prop('files');

        // Quantity of files uploaded...

        var fileCount = allFiles.length;

        if (fileCount > 0) {

            var form = $("#Form");

            var formData = new FormData(form[0]); // data within the form

            // Append all files to formData to send to backend...
            for (var i = 0; i < fileCount; i++) {

                formData.append(allFiles[i].name, allFiles[i]);

            }

            if ($(form).valid()) {
                $.ajax({
                    type: "POST",
                    url: "/Controller/UploadFiles",
                    data: formData,
                    contentType: false,
                    beforeSend: function () {
                       // Does stuff
                    },
                    processData: false,
                    cache: true,
                    success: function (partialViewResult) {
                 // Does stuff
                   }
                });

                return false;
            }
        }
    });

<form id="Form" enctype="multipart/form-data" method="post">
     <input id="allFilesInput" name="allFilesInput" type="file" hidden webkitdirectory/>
 </form>

        [HttpPost]

       public ActionResult UploadFiles(MyViewModel model)

        {
          // Empty upload no processing done, chrome still creates processes.
        }

 

 

    public class MyViewModel : ViewModel
    {

        public IEnumerable<HttpPostedFileBase> AllPayrollFiles { get; set; }
    }

标签: c#jqueryasp.netajaxfile-upload

解决方案


推荐阅读