Подтвердить что ты не робот

Имитировать событие drop file

Можно ли имитировать/подделывать событие drop, используя только javascript? Как проверить этот тип события?

Возьмем, к примеру, этот dnd загружаем образец страница, возможно ли инициировать событие "drop" с файлом без фактического удаления файла там? Скажем, нажав на кнопку?

Я начал писать Sukuli script, который может управлять мышью и делать трюк, но я искал лучшее решение.

ИЗМЕНИТЬ

@kol ответ - хороший способ избавиться от события перетаскивания, но мне все же приходится вручную выбирать файл с моего компьютера. Это то, что меня интересует в симуляции. Есть ли способ создать файловую переменную программно?

var fileInput = document.getElementById('fileInput'),
file = fileInput.files[0];    
4b9b3361

Ответ 1

1. Удаление изображения, выбранного пользователем

Я сделал jsfiddle. Это урезанная версия страницы html5demos.com, о которой вы говорили, но:

  • Я добавил тэг <input type="file">, который можно использовать для выбора файла изображения с локального компьютера и
  • Я также добавил тэг <input type="button"> с обработчиком onclick, который имитирует событие "drop file" с помощью , напрямую вызывающего обработчик события ondrop для объекта DND div тег.

Обработчик ondrop выглядит следующим образом:

holder.ondrop = function (e) {
    this.className = '';
    e.preventDefault();
    readfiles(e.dataTransfer.files);
}

То есть мы должны передать аргумент ondrop, который

  • имеет поле dataTransfer с подполем массива files, которое содержит выбранные File и
  • имеет метод preventDefault (функция без тела будет делать).

Итак, обработчик onclick кнопки "Имитировать падение" выглядит следующим образом:

function simulateDrop() {
    var fileInput = document.getElementById('fileInput'),
        file = fileInput.files[0];        
    holder.ondrop({ 
        dataTransfer: { files: [ file ] }, 
        preventDefault: function () {} 
    });
}

Test

  • Выберите файл изображения (png, jpeg или gif)
  • Нажмите кнопку "Имитировать падение"

Результат

Result

2. Удаление файлов с автогенерированными тестовыми файлами без участия пользователя (ТОЛЬКО GOOGLE CHROME!!!)

Я сделал еще один jsfiddle. Когда страница загружается, вызывается функция, которая:

  • создает текстовый файл во временную файловую систему и
  • загружает и удаляет этот текстовый файл в цель <div>; затем
  • создает файл образа во временную файловую систему и
  • загружает и отбрасывает этот файл изображения в цель <div>.

Код этого вызова функции-симулятора выглядит следующим образом:

(function () {
    var fileErrorHandler = function (e) {
            var msg = "";
            switch (e.code) {
                case FileError.QUOTA_EXCEEDED_ERR:
                    msg = "QUOTA_EXCEEDED_ERR";
                    break;
                case FileError.NOT_FOUND_ERR:
                    msg = "NOT_FOUND_ERR";
                    break;
                case FileError.SECURITY_ERR:
                    msg = "SECURITY_ERR";
                    break;
                case FileError.INVALID_MODIFICATION_ERR:
                    msg = "INVALID_MODIFICATION_ERR";
                    break;
                case FileError.INVALID_STATE_ERR:
                    msg = "INVALID_STATE_ERR";
                    break;
                default:
                    msg = "Unknown Error";
                    break;
            };
            console.log("Error: " + msg);
        },
        requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem,
        dropFile = function (file) {
            holder.ondrop({ 
                dataTransfer: { files: [ file ] }, 
                preventDefault: function () {} 
            });
        };

    if (!requestFileSystem) {
        console.log("FileSystem API is not supported");
        return;
    }
    requestFileSystem(
        window.TEMPORARY, 
        1024 * 1024, 
        function (fileSystem) {
            var textFile = {
                    name: "test.txt",
                    content: "hello, world",
                    contentType: "text/plain"
                },
                imageFile = {
                    name: "test.png",
                    content: "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
                    contentType: "image/png",
                    contentBytes: function () {
                        var byteCharacters = atob(this.content),
                            byteArrays = [], offset, sliceSize = 512, slice, byteNumbers, i, byteArray;

                        for (offset = 0; offset < byteCharacters.length; offset += sliceSize) {
                            slice = byteCharacters.slice(offset, offset + sliceSize);
                            byteNumbers = new Array(slice.length);
                            for (i = 0; i < slice.length; i++) {
                                byteNumbers[i] = slice.charCodeAt(i);
                            }
                            byteArray = new Uint8Array(byteNumbers);
                            byteArrays.push(byteArray);
                        }
                        return byteArrays;
                    }
                };

            // Create and drop text file
            fileSystem.root.getFile(
                textFile.name, 
                { create: true }, 
                function (fileEntry) {
                    fileEntry.createWriter(
                        function (fileWriter) {
                            fileWriter.onwriteend = function(e) {
                                console.log("Write completed (" + textFile.name + ")");
                                fileSystem.root.getFile(
                                    textFile.name, 
                                    {}, 
                                    function (fileEntry) {
                                        fileEntry.file(
                                            function (file) {
                                                dropFile(file);
                                            }, 
                                            fileErrorHandler
                                        );
                                    }, 
                                    fileErrorHandler
                                );    

                            };
                            fileWriter.onerror = function(e) {
                                console.log("Write failed (" + textFile.name + "): " + e.toString());
                            };
                            fileWriter.write(new Blob([ textFile.content ], { type: textFile.contentType }));
                        }, 
                        fileErrorHandler
                    );
                }, 
                fileErrorHandler
            );

            // Create and drop image file
            fileSystem.root.getFile(
                imageFile.name, 
                { create: true }, 
                function (fileEntry) {
                    fileEntry.createWriter(
                        function (fileWriter) {
                            fileWriter.onwriteend = function(e) {
                                console.log("Write completed (" + imageFile.name + ")");
                                fileSystem.root.getFile(
                                    imageFile.name, 
                                    {}, 
                                    function (fileEntry) {
                                        fileEntry.file(
                                            function (file) {
                                                dropFile(file);
                                            }, 
                                            fileErrorHandler
                                        );
                                    }, 
                                    fileErrorHandler
                                );    

                            };
                            fileWriter.onerror = function(e) {
                                console.log("Write failed (" + imageFile.name + "): " + e.toString());
                            };
                            fileWriter.write(new Blob(imageFile.contentBytes(), { type: imageFile.contentType }));
                        }, 
                        fileErrorHandler
                    );
                }, 
                fileErrorHandler
            );
        }, 
        fileErrorHandler
    );    
})();

Содержимое автогенерированного текстового файла указывается в виде строки, а содержимое файла изображения указывается как строка с кодировкой base64. Их легко изменить. Например, тестовый текстовый файл может содержать не только обычный текст, но и HTML. В этом случае не забудьте изменить поле textFile.contentType от text/plain до text/html и добавить этот тип содержимого в массив acceptedTypes и в функцию previewfile. Тестовое изображение также может быть легко изменено, вам просто нужен конвертер image-to-base64.

Мне пришлось расширить код обработчика drop для обработки текстовых файлов в дополнение к изображениям:

acceptedTypes = {
    'text/plain': true, // <-- I added this
    'image/png': true,
    'image/jpeg': true,
    'image/gif': true
},

...

function previewfile(file) {
    if (tests.filereader === true && acceptedTypes[file.type] === true) {
        var reader = new FileReader();
        if (file.type === 'text/plain') { // <-- I added this branch
            reader.onload = function (event) {
                var p = document.createElement("p"); 
                p.innerText = event.target.result;
                holder.appendChild(p);
            }
            reader.readAsText(file);
        } else {
            reader.onload = function (event) {
                var image = new Image();
                image.src = event.target.result;
                image.width = 250; // a fake resize
                holder.appendChild(image);
            };
            reader.readAsDataURL(file);
        }
    } else {
        holder.innerHTML += '<p>Uploaded ' + file.name + ', ' + file.size + ' B, ' + file.type;
        console.log(file);
    }
}

Обратите внимание, что после загрузки jsfiddle автогенерированные файлы могут быть указаны для целей отладки:

Temporary file system

Результат

Result

Снимок экрана показывает, что имитированный снимок вставил содержимое автогенерированного текстового файла перед автогенерированным изображением. HTML-код DND-target <div> выглядит так:

<div id="holder" class="">
    <p>hello, world</p>
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggkFBTzlUWEwwWTRPSHdBQUFBQkpSVTVFcmtKZ2dnPT0=" width="250">
</div>

Ответ 2

@kol ответ - хороший способ избавиться от события перетаскивания, но я все равно придется вручную выбрать файл с моего компьютера. Это бит Меня интересует симуляция. Есть ли способ создать файл переменная программно? -caiocpricci2

Попробуйте это

function createFile() {
  var create = ["<!doctype html><div>file</div>"];
  var blob = new Blob([create], {"type" : "text/html"});
  return ( blob.size > 0 ? blob : "file creation error" )
};
createFile()