【问题标题】:jQuery File Upload - Single Upload Sending Data Multiple TimesjQuery 文件上传 - 单次上传多次发送数据
【发布时间】:2017-01-20 16:30:02
【问题描述】:

我正在使用 jQuery File Upload 将图像异步上传到 .NET MVC 控制器。我有以下脚本运行

<script type="text/javascript">
$('#Image').fileupload({
    url: "/Home/PostUpdate",
    dataType: 'json',
    replaceFileInput: false,
    dropZone: null,
    autoUpload: false,
    maxNumberOfFiles: 1,
    maxFileSize: 2000000,
    add: function (e, data) {
        $("form").submit(function (event) {
            event.preventDefault();
            console.log("posting from jquery file upload");
            if ($("#Image")[0].files[0].size > 0 && ($("#PostText").val() === "" || $("#PostText").val() === undefined)) {
                // Warning message here
            }
            else {
                console.log("2a");
                data.submit();
            }
        });
    },
    done: function (e, data) {
        // Done code here...
    }
});


$("form").submit(function (event) {
    event.preventDefault();
    if ($("#Image")[0].files[0] == undefined) {
        console.log("posting from default ajax");
        var url = "/Home/PostUpdate/";
        $.ajax({
            url: url,
            datatype: "json",
            data: $(this).serialize(),
            cache: false,
            type: "POST",
            success: function (data) {
                // Success code here
            },
            error: function (response) {
                alert("error");
            }
        });
    }
});

</script>

我的 HTML 是标准的&lt;input type="file"/&gt;,所以我可以附加一个文件并上传,我看到该文件通过服务器端代码。我处理并添加到数据库中,没有问题。

我选择的第一张图片,上传一次。如果我然后选择第二张图片并上传,它会执行上传并点击 MVC 控制器两次。如果我选择第三张图片,上传会发生三次?它总是命中相同的data.submit(),即发生在console.log("2a") 的那个,但我不知道为什么它会发生多次?

我想知道 event.preventDefault() 是否导致它触发?但这不解释为什么我会收到三个、四个、五个帖子到控制器操作?

有没有其他人遇到过这种情况,如果有,您采取了哪些措施来解决它?

提前致谢!

【问题讨论】:

标签: javascript jquery asp.net-mvc file-upload jquery-file-upload


【解决方案1】:

这似乎是一个潜在的插件问题,解决方案是取消绑定并重新绑定点击事件:

由于我不相信似是而非的重复标志会产生最佳解决方案,所以我挖得更深一点:

回调问题

更改事件fileuploadchange 也可能比fileuploadadd 效果更好。您可以尝试使用{ change: function(){/**/} } 而不是{ add: function(){/**/} },但这似乎有点模棱两可。

html 问题

另一个post 谈到提交按钮主动提交表单,而这不应该是实现它的正确方法。


replacefileinput on false?

默认情况下,每次输入字段更改事件后,文件输入字段都会替换为克隆。这对于 iframe 传输队列是必需的,并且允许为相同的文件选择触发更改事件,但可以通过将此选项设置为 false 来禁用(更深入的信息可以在 FAQ 中找到)。

将其设置为true 并再次测试。

为什么每次选择后都会克隆和替换文件输入字段?

克隆有两个原因:

  • 首先确保即使随后选择了相同的文件(或文件名)也会触发更改事件。
  • 其次是允许 iframe 传输的上传队列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-31
    • 2010-10-08
    • 1970-01-01
    • 2017-04-21
    • 2019-01-29
    • 2023-03-26
    • 2015-05-22
    • 2021-12-06
    相关资源
    最近更新 更多