我正在使用Dropzone。我想阻止在Dropzone" panel"中上传已经作为缩略图存在的文件。上传时,我的意思是不允许在面板中显示两次具有相同名称的文件。我不关心服务器中已经存在的文件并且没有在面板中显示的情况,因为它将被具有相同名称的新文件替换。
尽管付出了努力,但我无法找到如何实现这一目标。我很感激你的帮助。
非常感谢
答案 0 :(得分:14)
添加以下简单的代码行:
myDropzone.on("addedfile", function(file) {
if (this.files.length) {
var _i, _len;
for (_i = 0, _len = this.files.length; _i < _len - 1; _i++) // -1 to exclude current file
{
if(this.files[_i].name === file.name && this.files[_i].size === file.size && this.files[_i].lastModifiedDate.toString() === file.lastModifiedDate.toString())
{
this.removeFile(file);
}
}
}
});
答案 1 :(得分:7)
以下是我的解决方案:
在Dropzone初始化中添加这两个选项
dictDuplicateFile: "Duplicate Files Cannot Be Uploaded",
preventDuplicates: true,
并添加一个原型函数,并在dropzone初始化之上重新实现dropzone addFile
原型函数,如下所示:
Dropzone.prototype.isFileExist = function(file) {
var i;
if(this.files.length > 0) {
for(i = 0; i < this.files.length; i++) {
if(this.files[i].name === file.name
&& this.files[i].size === file.size
&& this.files[i].lastModifiedDate.toString() === file.lastModifiedDate.toString())
{
return true;
}
}
}
return false;
};
Dropzone.prototype.addFile = function(file) {
file.upload = {
progress: 0,
total: file.size,
bytesSent: 0
};
if (this.options.preventDuplicates && this.isFileExist(file)) {
alert(this.options.dictDuplicateFile);
return;
}
this.files.push(file);
file.status = Dropzone.ADDED;
this.emit("addedfile", file);
this._enqueueThumbnail(file);
return this.accept(file, (function(_this) {
return function(error) {
if (error) {
file.accepted = false;
_this._errorProcessing([file], error);
} else {
file.accepted = true;
if (_this.options.autoQueue) {
_this.enqueueFile(file);
}
}
return _this._updateMaxFilesReachedClass();
};
})(this));
};
如果需要,您还可以修改drozone文件。
答案 2 :(得分:2)
我从服务器检查文件是否重复,然后将错误返回到dropzone,如下所示:
$targetPath = '/tmp/my_dropzone_files';
$image_name = $_FILES['file']['name'];
$targetFile = $targetPath . '/' . $image_name;
$file_exists = file_exists ( $targetFile );
if( !$file_exists ) //If file does not exists then upload
{
move_uploaded_file( $tempFile, $targetFile );
}
else //If file exists then echo the error and set a http error response
{
echo 'Error: Duplicate file name, please change it!';
http_response_code(404);
}
答案 3 :(得分:0)
抱歉,无法在@Luca 的回答中添加评论。
需要中断循环以防止添加多个重复文件时可能出现的问题。
myDropzone.on("addedfile", function(file) {
if (this.files.length) {
var _i, _len = this.files.length;
for (_i = 0; _i < _len - 1; _i++) // -1 to exclude current file
{
if(this.files[_i].name === file.name && this.files[_i].size === file.size && this.files[_i].lastModifiedDate.toString() ===
file.lastModifiedDate.toString())
{
this.removeFile(file);
break;
}
}
}
});
答案 4 :(得分:-2)
以下解决方案帮助了我:
this.on('addedfile', function(file) {
setTimeout(function() {
$(".dz-file-preview").remove(); // removes all files except images
}, 3000);
});