【问题标题】:Removing a file in modern browsers在现代浏览器中删除文件
【发布时间】:2011-12-14 01:31:21
【问题描述】:

问题

我目前正在使用 (https://github.com/blueimp/jQuery-File-Upload/wiki) 这个 jQuery HTML5 上传器。 基础版,无ui。

最大的问题是,我到处寻找(Mozilla 开发者网络、SO、Google 等)并没有找到删除已通过拖放或手动通过文件输入对话框添加的文件的解决方案。

为什么要实现删除文件? 因为HTML5似乎有一种“bug”。 如果您删除/选择一个文件(文件输入已设置多个)上传它,然后删除/选择另一个文件,您现在神奇地拥有了两次新文件,并且它被上传了两次。

为了防止这个神奇的文件缓存用户必须刷新页面,这不是人们希望他的现代 AJAX Web 应用程序拥有的。

到目前为止我所尝试的:

  • .reset()
  • .remove()
  • 重置按钮
  • 将 .val() 设置为 ''

这似乎是一般的 HTML5 JS 问题,不是 jQuery 特有的。

理论

可能是$j('#post').click(我多次绑定/重新绑定不同的回调)堆叠回调方法,以便每次调用 updateFileupload 函数时都会设置一个额外的回调。 实际问题现在将不再依赖于 HTML5 上传,它现在将依赖于我的能力,在我的提交按钮 (id=#post) 上未绑定 .click 操作。 如果我们现在在每次 .click 之前调用 .unbind,就不应该有任何重复的回调绑定。

代码

包含上传代码的函数:

function updateFileupload (type) {
            var destination = "";

            switch(type)
            {
                case upload_type.file:
                    destination = '/wall/uploadfile/id/<?=$this->id?>';
                    break;
                case upload_type.image:
                    destination = '/wall/upload/id/<?=$this->id?>';
                    break;
            }

            $j('#fileupload').fileupload({
                dataType: 'json',
                url: destination,
                singleFileUploads: false,
                autoUpload: false,
                dropZone: $k(".dropZone"),
                done: function (e, data) {
                    console.log("--:--");
                    console.log(data.result);
                    upload_result = data.result;
                    console.log(upload_result);
                    console.log("--:--");
                    console.log(type);
                    if(type == upload_type.image)
                    {
                        var imageName = upload_result.real;
                                        console.log(imageName);
                                        $k.get('/wall/addpicture/id/<?=$this->id ?>/name'+imageName, function(data){
                                                if(data > 0){
                                                        console.log("I made it through!");
                                                        if(!data.id)
                                                        {
                                                            $k('#imgUpload').html(''); 
                                                            //$k('#imgPreview').fadeOut(); 
                                                            $k('#newPost').val('');
                                                            $k.get("/wall/entry/id/"+data, function(html){
                                                                    $k('#postList').prepend(html);

                                                            }); 
                                                        }
                                                }
                                        });
                    }
                  },
                send: function(e, data){

                        var files = data.files;
                        var duplicates = Array(); // Iterate over all entries and check whether any entry matches the current and add it to duplicates for deletion

                        for(var i=0; i<data.files.length;i++)
                        {
                            for(var j=0;j<data.files.length-1;j++)
                            {
                                if(files[i].name == files[j].name && i != j)
                                {
                                    duplicates.push(j);
                                }
                            }

                        }
                        if(duplicates.length > 0)
                        {
                            for(var i=0;i<duplicates.length;i++)
                                files.splice(i, 1);
                        }

                        console.log("Duplicates");
                        console.log(duplicates);
                },
                drop: function(e, data){
                    console.log("outside");
//                    $k.each(data.files, function(index, file){
//                            $k('#imageListDummy').after('<li class="file-small-info-box">'+file.name+'</li>');
//                            console.log(file);
//                            
//                        });
                },
                add: function(e, data){

                        upload_data = data;

                        console.log(data);
                        $k.each(data.files, function(index, file){
                            $k('#imageListDummy').after('<li class="file-small-info-box">'+file.name+'</li>');
                            console.log(file);

                        });
                        $j('#post').click(function(event){
                                    upload_data.submit();

                                    if(type == upload_type.image)
                                    {
                                        var file = upload_data.files[0];
                                        console.log("I am here");
                                        console.log(file);
                                        var img = document.createElement("img");


                                        img.src = window.URL.createObjectURL(file);
                                        img.height = 64;
                                        img.width = 64;
                                        img.onload = function(e) {  
                                            window.URL.revokeObjectURL(this.src);  
                                        }
                                        document.getElementById('imgPreview').appendChild(img);


                                        $k('#imgPreview').show();
                                    }
                                    clickPostCallback(event);


                                   });
                        $j('#showSubmit').show();
                    }

                });
        }

【问题讨论】:

  • ... 或者它可能是您自己的代码中的错误。但是,我们无法确定您是否不发布它。
  • 您也阅读了该插件的常见问题解答,尤其是。问题“如何清除上传文件列表”?
  • @Pointy 这是关于表示 FileList 对象。常见问题部分仅讨论表示,而不是操纵。

标签: javascript jquery file html file-upload


【解决方案1】:

这可能更多是浏览器安全问题。 当前的文件上传规范不允许 javascript(或据我所知的任何内容)篡改文件字段的值,即使将其删除也是如此。

所以我想任何好的文件上传器都会创建多个文件上传字段,这样您就可以删除整个字段而不是使用值?

不过这是猜测。

更新问题的更新答案:

click() 不应该只绑定一次吗?您不需要将单击事件重新绑定到单个元素“#post”(除非此元素发生更改,在这种情况下它应该是一个类)。您可以将 click() 事件绑定放在文件上传选项之外,只要它包含在 $(function(){} 中,这样就可以在 DOM 准备就绪时。

除此之外,我正在尝试在没有任何 HTML 并且没有多个文件上传经验的情况下阅读代码。最好的办法是尝试在jsfiddle.net 上重新创建它,这样其他人就可以在不影响您的情况下进入并使用代码,并且您可能会在将代码放在那里时发现问题:)

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2010-11-19
    • 2011-02-18
    相关资源
    最近更新 更多