Ответ 1
1. Удаление изображения, выбранного пользователем
Я сделал jsfiddle. Это урезанная версия страницы html5demos.com, о которой вы говорили, но:
- Я добавил тэг
<input type="file">
, который можно использовать для выбора файла изображения с локального компьютера и - Я также добавил тэг
<input type="button">
с обработчикомonclick
, который имитирует событие "drop file" с помощью , напрямую вызывающего обработчик событияondrop
для объекта DNDdiv
тег.
Обработчик 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)
- Нажмите кнопку "Имитировать падение"
Результат
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 автогенерированные файлы могут быть указаны для целей отладки:
Результат
Снимок экрана показывает, что имитированный снимок вставил содержимое автогенерированного текстового файла перед автогенерированным изображением. HTML-код DND-target <div>
выглядит так:
<div id="holder" class="">
<p>hello, world</p>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggkFBTzlUWEwwWTRPSHdBQUFBQkpSVTVFcmtKZ2dnPT0=" width="250">
</div>