我在我的项目中使用dropzone.js
,我想要做的是手动添加文件到队列而不打开文件浏览器对话框,dropzone已经在页面上带有.imageDropzone类的元素上初始化了我正在尝试运行以下脚本来添加文件,
Dropzone.autoDiscover=false;
var myZone=Dropzone.forElement('.imageDropzone');
var fileList=$("input[accept='image/jpg,image/gif,image/png,image/jpeg']")[0].files;
fileList.name="imageUploadTestJPG.jpg";
fileList.type="image/jpeg";
fileList.size=30170,
fileList.path="http://mysite/img/imageUploadTestJPG.jpg";
fileList.mozFullPath="http://mysite/img/imageUploadTestJPG.jpg";
fileList.accept="image/jpg,image/gif,image/png,image/jpeg";
console.log(fileList);
myZone.addFile(fileList);
1 即可。我正在使用php-webdriver,我需要测试上传功能,
2. 点击文件类型输入后打开的文件浏览器对话框取决于操作系统,在不同的操作系统中有所不同,我无法将控制权转移到该窗口,所以我想跳过这个通过单击打开文件对话框并希望手动添加文件javascript / jquery并保留autoProcessFiles=true
的过程,以便在添加文件后上传过程即开始,但我无法解决。
当我尝试拨打Dropzone.addFile()
时,我会收到以下
TypeError:FormData.append的参数2没有实现接口 团块
我的事件尝试了另一种方式,即
1 即可。将文件路径添加到初始化dropzone的文件输入,因为dropzone将change eventlistener
绑定到使用dropzone初始化的所有file inputs
,并且尽快提供了{{1}的文件路径触发并开始上传文件,但尝试使用dropzone初始化引发的安全异常来修改文件输入的值。
2 即可。此外,change event listener
在初始化时被<input type=file>
脚本隐藏,并且php-webdriver不允许与隐藏元素进行交互,所以我坚持这一点,任何帮助或指导都将不胜感激。
答案 0 :(得分:2)
完成,
问题在于提供给myZone.addFile()
的FileList对象的格式。如果您打开dropzone.js
文件并转到那里的Dropzone.prototype.init
函数,您将看到一个检查
if (this.clickableElements.length) {
在此检查中,dropzone创建&amp;配置隐藏文件输入,然后将该输入元素附加到正文document.body.appendChild(_this.hiddenFileInput);
,然后在此行删除区将change
eventlistener添加到创建的文件类型输入中,该文件类型输入在我们通过提供文件时立即触发浏览文件窗口。
return _this.hiddenFileInput.addEventListener("change", function() {
当我们提供文件时,它会触发并创建FileList
对象,请参阅
files = _this.hiddenFileInput.files;
如果您尝试在控制台console.log(files)
中记录它,您将看到创建的FileList
FileList { 0=File, length=1, item=item(), more...}
在firebug中单击此对象时,您将看到下面的详细信息
0 File { size=21789, type="image/png", name="1-7-2013 6-19-44 PM.png", more...}
length 1
__proto__ FileListPrototype { item=item(), @@iterator=@@iterator()}
现在我创建文件列表对象的方式结果是
_removeLink ----- a.dz-remove javascrip...defined;
accept ----- "image/jpg,image/gif,image/png,image/jpeg"
accepted ----- true
mozFullPath ----- "http://mysite/img/imageUploadTestJPG.jpg"
name ----- "imageUploadTestJPG.jpg"
path ----- "http://mysite/img/imageUploadTestJPG.jpg"
previewElement -- div.dz-preview
previewTemplate --- div.dz-preview
processing ----- true
size 30170
status ----- "uploading"
type "image/jpeg"
upload ----- Object { progress=0, total=30170, bytesSent=0}
xhr XMLHttpRequest { readyState=1, timeout=0, withCredentials=false, more...}
length 0
__proto__ FileListPrototype { item=item(), @@iterator=@@iterator()}
注意第一个细节上的索引0
,其中包含文件的详细信息,而第二个是我自定义构建的FileList对象的结果,该文件的所有详细信息都在主内部而不是内部index 0
。
所以要创建一个类似于我必须首先获取blob的对象,方法是向图像发送xmlHttpRequest
请求并指定响应类型arraybuffer
,然后获取blob URL
对于图像数据,然后将该响应分配给文件对象,并将其分配给input.file
并调用Dropzone.addFile()
。该过程的完整描述如下,您可以在不打开文件浏览窗口的情况下上传文件,并使用带有selenium的dropzone.js
// Simulate a call to service that can
// return an image as an ArrayBuffer.
var xhr = new XMLHttpRequest();
// Use JSFiddle logo as a sample image to avoid complicating
// this example with cross-domain issues.
xhr.open( "GET", "http://localhost/path/to/my/image.jpg", true );
// Ask for the result as an ArrayBuffer.
xhr.responseType = "arraybuffer";
xhr.onload = function( e ) {
// Obtain a blob: URL for the image data.
var arrayBufferView = new Uint8Array( this.response );
var blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } );
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL( blob );
var parts = [blob, new ArrayBuffer()];
file = new File(parts, "imageUploadTestFile", {
lastModified: new Date(0), // optional - default = now
type: "image/jpeg"
});
$("input[accept=\'image/jpg,image/gif,image/png,image/jpeg\']").files = [file];
myzone = Dropzone.forElement(".imageDropzone");
myzone.addFile(file);
};
xhr.send();