Javascript 在现代浏览器中删除文件 问题
我目前正在使用()这个jQuery HTML5上传程序。 基本版本,没有ui 最大的问题是,我到处寻找(Mozilla Developer Network、SO、Google等),没有找到删除通过dragNdrop或通过文件输入对话框手动添加的文件的解决方案 为什么要实现删除文件? 因为HTML5似乎有一种“bug”。 如果您拖放/选择一个文件(文件输入设置了多个文件),请上载它,然后拖放/选择另一个文件,您现在神奇地拥有了新文件两次,并将其上载两次 为了防止这种神奇的文件缓存,用户必须刷新页面,而这并不是人们想要的现代AJAX web应用程序 到目前为止,我所尝试的:Javascript 在现代浏览器中删除文件 问题,javascript,jquery,file,html,file-upload,Javascript,Jquery,File,Html,File Upload,我目前正在使用()这个jQuery HTML5上传程序。 基本版本,没有ui 最大的问题是,我到处寻找(Mozilla Developer Network、SO、Google等),没有找到删除通过dragNdrop或通过文件输入对话框手动添加的文件的解决方案 为什么要实现删除文件? 因为HTML5似乎有一种“bug”。 如果您拖放/选择一个文件(文件输入设置了多个文件),请上载它,然后拖放/选择另一个文件,您现在神奇地拥有了新文件两次,并将其上载两次 为了防止这种神奇的文件缓存,用户必须刷新页面
- .reset()
- .删除()
- 复位按钮
- 将.val()设置为“”
$j(“#post”)。单击
(我绑定/重新绑定了很多次不同的回调),堆叠回调方法,以便每次调用updateFileupload函数时都设置一个额外的回调。
现在实际的问题不再依赖HTML5上传,而是依赖于我的可能,错过绑定。点击我的提交按钮(id=#post)上的操作。
如果我们现在调用。在每个之前取消绑定。单击不应存在任何重复的回调绑定。
代码
包含上载代码的函数:
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();
}
});
}
函数updateFileupload(类型){
var destination=“”;
开关(类型)
{
案例上传_type.file:
destination='/wall/uploadfile/id/';
打破
案例上传\u类型图像:
目的地='/wall/upload/id/';
打破
}
$j('#fileupload')。fileupload({
数据类型:“json”,
网址:目的地,
singleFileUploads:false,
自动上载:false,
dropZone:$k(“.dropZone”),
完成:功能(e,数据){
console.log(“-:-”);
console.log(data.result);
上传结果=data.result;
控制台日志(上传结果);
console.log(“-:-”);
console.log(类型);
if(type==upload\u type.image)
{
var imageName=upload_result.real;
console.log(imageName);
$k.get('/wall/addpicture/id//name'+imageName,函数(数据){
如果(数据>0){
log(“我成功了!”);
如果(!data.id)
{
$k('#imgUpload').html('');
//$k(“#imgPreview”).fadeOut();
$k(“#newPost”).val(“”);
$k.get(“/wall/entry/id/”+数据,函数(html){
$k(“#postList”).prepend(html);
});
}
}
});
}
},
发送:功能(e、数据){
var files=data.files;
var duplicates=Array();//迭代所有条目,检查是否有任何条目与当前条目匹配,并将其添加到重复条目中进行删除
对于(var i=0;i而言,这可能更像是一个浏览器安全问题。
当前的文件上传规范不允许javascript(或据我所知的任何东西)篡改文件字段的值,即使删除它
所以我想任何一个好的文件上传程序都会创建多个文件上传字段,这样你就可以删除整个字段,而不是使用值
不过,这只是猜测
更新问题的更新答案:
click()不应该只绑定一次吗?您不应该将click()事件重新绑定到单个元素“#post”(除非该元素发生更改,在这种情况下,它实际上应该是一个类)。您可以将click()事件绑定放在文件上载选项之外,只要它包含在$(function(){}中,这样就可以在DOM就绪时进行绑定
除此之外,我尝试在没有任何HTML的情况下阅读代码,也没有多文件上传的经验。最好的做法是尝试重新创建代码,这样其他人就可以在不影响您的情况下使用代码,并且在将代码放在其中时可能会发现问题:)…或者这可能是您自己代码中的一个错误。但是,我们无法判断您是否没有发布它。您是否阅读了该插件的常见问题解答,尤其是“如何清除上载文件列表”的问题?@Pointy这是关于表示FileList对象的。常见问题解答部分仅讨论表示,而不是操作。