Dropzone renameFilename与removedfile冲突:仅能删除首个上传文件
问题分析
你遇到的问题根源很明确:全局变量name被所有上传文件共享。每次调用renameFilename时,这个全局变量都会被覆盖为当前文件的新名称,导致删除操作始终只能拿到最后一次(或因操作顺序出现的第一张)赋值的文件名,无法正确匹配要删除的目标文件。
解决方案
我们需要把每个文件重命名后的名称绑定到对应的file对象本身,而非用全局变量存储。Dropzone的file对象支持添加自定义属性,这样删除时就能直接从当前要删除的file实例中获取正确文件名。
修改后的完整代码如下:
Dropzone.autoDiscover = false; // 移除全局变量name,不再依赖它存储文件名 var myDropzone = new Dropzone(".dropzone", { maxFileSize: 50, acceptedFiles: ".jpg,.png", addRemoveLinks: true, renameFilename: function (filename) { // 生成带时间戳的唯一文件名 const newName = new Date().getTime() + '-' + filename; // 将新文件名绑定到当前file实例的自定义属性中 this.upload.customName = newName; return newName; }, removedfile: function(file){ // 直接从当前要删除的file对象中读取对应的重命名文件名 $.ajax({ type: 'POST', url: route('product.images.remove'), data:{ name: file.upload.customName }, dataType: 'html' }); var _ref; return(_ref = file.previewElement) != null ? _ref.parentNode.removeChild(file.previewElement) : void 0; } });
关键改动说明
- 移除全局变量
name:彻底避免多个文件之间的文件名覆盖问题,每个文件的新名称独立存储。 - 绑定文件名到
file实例:在renameFilename函数中,this指向当前上传的file对象,我们把生成的新文件名存入file.upload.customName(upload是Dropzone为每个文件内置的对象,可安全添加自定义属性)。 - 删除时精准获取文件名:在
removedfile函数中,直接从参数file里读取file.upload.customName,确保每次删除请求携带的都是当前目标文件的正确名称。
这样修改后,既能保留文件名去重的需求,又能让删除功能对任意上传文件都正常生效。
内容的提问来源于stack exchange,提问作者newsshare24h
相关产品推荐
相关产品推荐

