ÐÑполÑзÑÑ File API, добавленнÑй к DOM в HTML5, в веб-пÑиложениÑÑ
ÑепеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ запÑаÑиваÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð²ÑбÑаÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе ÑÐ°Ð¹Ð»Ñ Ð¸ заÑем ÑиÑаÑÑ ÑодеÑжимое ÑÑиÑ
Ñайлов. ÐÑÐ±Ð¾Ñ Ñайлов Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑÑеÑÑвлÑÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑлеменÑа <input>
или drag and drop.
ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе иÑполÑзоваÑÑ DOM File API в ÑаÑÑиÑениÑÑ Ð¸Ð»Ð¸ коде Chrome, иÑполÑзÑйÑе. Ðа Ñамом деле, в Ñаком ÑлÑÑае вам Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ознакомиÑÑÑÑ Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми нÑанÑами. См. ÑÑаÑÑÑ Using the DOM File API in chrome code Ð´Ð»Ñ Ð¿Ð¾Ð´ÑобноÑÑей.
ÐоÑÑÑп к вÑбÑаннÑм ÑайламРаÑÑмоÑÑим ÑледÑÑÑий код:
<input type="file" id="input" multiple />
File API Ð´ÐµÐ»Ð°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм доÑÑÑп к FileList
, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð¾Ð±ÑекÑÑ File
, коÑоÑÑм ÑооÑвеÑÑÑвÑÑÑ ÑайлÑ, вÑбÑаннÑе полÑзоваÑелем.
ÐÑÑибÑÑ multiple
ÑлеменÑа input
позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð²ÑбÑаÑÑ Ð½ÐµÑколÑко Ñайлов.
ÐбÑаÑение к Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð²ÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ ÑÐ°Ð¹Ð»Ñ Ñ Ð¸ÑполÑзованием клаÑÑиÑеÑкой DOM-модели:
const selectedFile = document.getElementById("input").files[0];
ÐбÑаÑение к Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð²ÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ ÑÐ°Ð¹Ð»Ñ ÑеÑез jQuery:
var selectedFile = $("#input").get(0).files[0];
var selectedFile = $("#input")[0].files[0];
ÐÑимеÑание: ÐÑибка "files is undefined" ознаÑÐ°ÐµÑ ÑÑо бÑл вÑбÑан не один HTML-ÑлеменÑ, а ÑпиÑок ÑлеменÑов, возвÑаÑаемÑй jQuery. ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÑоÑниÑÑ, Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾ именно ÑлеменÑа ÑÑебÑеÑÑÑ Ð²ÑзваÑÑ Ð¼ÐµÑод "files"
ÐоÑÑÑп к вÑбÑаннÑм Ñайлам ÑеÑез ÑобÑÑие changeТакже возможно (но не обÑзаÑелÑно) полÑÑиÑÑ Ð´Ð¾ÑÑÑп к FileList
ÑеÑез ÑобÑÑие change
. ÐÑжно иÑполÑзоваÑÑ EventTarget.addEventListener()
ÑÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð¾Ð±ÑабоÑÑик ÑобÑÑÐ¸Ñ change
, как показано здеÑÑ:
const inputElement = document.getElementById("input");
inputElement.addEventListener("change", handleFiles, false);
function handleFiles() {
const fileList = this.files; /* now you can work with the file list */
}
ÐбÑабоÑÑик ÑобÑÑÐ¸Ñ change
можно назнаÑиÑÑ Ð°ÑÑибÑÑом ÑлеменÑа:
<input type="file" id="input" onchange="handleFiles(this.files)" />
Ðогда полÑзоваÑÐµÐ»Ñ Ð²ÑбиÑÐ°ÐµÑ Ñайл, ÑÑнкÑÐ¸Ñ handleFiles() бÑÐ´ÐµÑ Ð²Ñзвана Ñ Ð¾Ð±ÑекÑом FileList
, коÑоÑÑй ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· обÑекÑов File
, пÑедÑÑавлÑÑÑиÑ
ÑайлÑ, вÑбÑаннÑе полÑзоваÑелем.
ÐбÑÐµÐºÑ FileList
пÑедоÑÑавлÑемÑй клаÑÑиÑеÑким DOM ÑодеÑÐ¶Ð¸Ñ Ð²Ñе ÑÐ°Ð¹Ð»Ñ Ð²ÑбÑаннÑе полÑзоваÑелем, каждÑй из коÑоÑÑÑ
пÑедÑÑавлÑÐµÑ Ñобой обÑÐµÐºÑ File
. ÐÑ Ð¼Ð¾Ð¶ÐµÑе опÑеделиÑÑ ÑколÑко Ñайлов вÑбÑал полÑзоваÑÐµÐ»Ñ Ð¿ÑовеÑÑÑ Ð·Ð½Ð°Ñение аÑÑибÑÑа Ð´Ð»Ð¸Ð½Ñ (length
) ÑпиÑка Ñайлов:
var numFiles = files.length;
ÐонкÑеÑнÑе обÑекÑÑ File
могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð¾Ð±ÑаÑением к ÑпиÑÐºÑ Ñайлов как к маÑÑивÑ:
for (var i = 0, numFiles = files.length; i < numFiles; i++) {
var file = files[i];
..
}
ÐÑÐ¾Ñ Ñикл пÑÐ¾Ñ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ вÑем Ñайлам в ÑпиÑке Ñайлов.
ÐÑего ÑÑÑеÑÑвÑÐµÑ ÑÑи аÑÑибÑÑа, пÑедоÑÑавлÑемÑÑ
обÑекÑом File
, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½ÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ Ñайле.
name
ÐÐ¼Ñ Ñайла как ÑÑÑока доÑÑÑÐ¿Ð½Ð°Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ. ÐÑо пÑоÑÑо Ð¸Ð¼Ñ Ñайла и оно не вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ пÑÑи.
size
Ð Ð°Ð·Ð¼ÐµÑ Ñайла в байÑÐ°Ñ , как 64-биÑное Ñелое ÑиÑло (возможно ÑолÑко ÑÑение).
type
MIME Ñип Ñайла, как ÑÑÑока доÑÑÑÐ¿Ð½Ð°Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ, или пÑÑÑÐ°Ñ ÑÑÑока (""
) еÑли Ñип Ñайла не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑеделÑн.
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑÐ²Ð°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ðµ иÑполÑзование ÑвойÑÑва size
:
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>File(s) size</title>
<script>
function updateSize() {
var nBytes = 0,
oFiles = document.getElementById("uploadInput").files,
nFiles = oFiles.length;
for (var nFileId = 0; nFileId < nFiles; nFileId++) {
nBytes += oFiles[nFileId].size;
}
var sOutput = nBytes + " bytes";
// optional code for multiples approximation
for (
var aMultiples = [
"KiB",
"MiB",
"GiB",
"TiB",
"PiB",
"EiB",
"ZiB",
"YiB",
],
nMultiple = 0,
nApprox = nBytes / 1024;
nApprox > 1;
nApprox /= 1024, nMultiple++
) {
sOutput =
nApprox.toFixed(3) +
" " +
aMultiples[nMultiple] +
" (" +
nBytes +
" bytes)";
}
// end of optional code
document.getElementById("fileNum").innerHTML = nFiles;
document.getElementById("fileSize").innerHTML = sOutput;
}
</script>
</head>
<body onload="updateSize();">
<form name="uploadForm">
<p>
<input
id="uploadInput"
type="file"
name="myFiles"
onchange="updateSize();"
multiple />
selected files: <span id="fileNum">0</span>; total size:
<span id="fileSize">0</span>
</p>
<p><input type="submit" value="Send file" /></p>
</form>
</body>
</html>
ÐÑполÑзование меÑода click() ÑкÑÑÑÑÑ
ÑлеменÑов вÑбоÑа Ñайла
ÐаÑÐ¸Ð½Ð°Ñ Ñ Gecko 2.0, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑкÑÑÑÑ Ð½ÐµÐ¿ÑивлекаÑелÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ <input>
и пÑедоÑÑавиÑÑ Ñвой ÑобÑÑвеннÑй инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ Ð¾ÑкÑÑÑÐ¸Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²Ð¾Ð³Ð¾ окна вÑбоÑа и оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñайла или Ñайлов, вÑбÑаннÑÑ
полÑзоваÑелем. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑделаÑÑ ÑÑо, пÑиÑвоив ÑвойÑÑÐ²Ñ display ÑлеменÑа input знаÑение none (display:none) и вÑзÑÐ²Ð°Ñ Ð¼ÐµÑод click()
ÑкÑÑÑого ÑлеменÑа <input>
.
РаÑÑмоÑÑим ÑледÑÑÑÑÑ ÑазмеÑÐºÑ HTML:
<input
type="file"
id="fileElem"
multiple
accept="image/*"
style="display:none"
onchange="handleFiles(this.files)" />
<a href="#" id="fileSelect">Select some files</a>
Ðод, обÑабаÑÑваÑÑий ÑобÑÑие click, Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ ÑледÑÑÑим обÑазом:
var fileSelect = document.getElementById("fileSelect"),
fileElem = document.getElementById("fileElem");
fileSelect.addEventListener(
"click",
function (e) {
if (fileElem) {
fileElem.click();
}
e.preventDefault(); // пÑедоÑвÑаÑÐ°ÐµÑ Ð¿ÐµÑемеÑение к "#"
},
false,
);
Таким обÑазом, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑилизоваÑÑ Ð½Ð¾Ð²ÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð¾ÑкÑÑÑÐ¸Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð° вÑбоÑа Ñайла Ñак, как пожелаеÑе.
ÐÑполÑзование ÑлеменÑа label ÑкÑÑÑого ÑлеменÑа inputÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¾ÑкÑÑÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³ вÑбоÑа Ñайла без иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ JavaScript (меÑода click()), можно воÑполÑзоваÑÑÑÑ ÑлеменÑом <label>
.
РаÑÑмоÑÑим ÑледÑÑÑÑÑ ÑазмеÑÐºÑ HTML:
<input
type="file"
id="fileElem"
multiple
accept="image/*"
style="display:none"
onchange="handleFiles(this.files)" />
<label for="fileElem">Select some files</label>
Рданном ÑлÑÑае Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи добавлÑÑÑ ÐºÐ¾Ð´ JavaScript Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð²ÑзваÑÑ fileElem.click()
. Также в данном ÑлÑÑае Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑилизоваÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ label Ñак, как пожелаеÑе.
Также Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑедоÑÑавиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑеÑаÑкиваÑÑ ÑÐ°Ð¹Ð»Ñ Ð² ваÑе веб-пÑиложение.
Ðа пеÑвом Ñаге Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ опÑеделиÑÑ Ð·Ð¾Ð½Ñ, в коÑоÑÑÑ Ð±ÑдÑÑ Ð¿ÐµÑеÑаÑкиваÑÑÑÑ ÑайлÑ. Ркаждом конкÑеÑном ÑлÑÑае ÑаÑÑÑ ÑодеÑжимого ваÑей ÑÑÑаниÑÑ, оÑвеÑÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð·Ð° пÑиÑÐ¼ÐºÑ Ð¿ÐµÑеÑаÑкиваемÑÑ Ñайлов, Ð¼Ð¾Ð¶ÐµÑ Ð²Ð°ÑÑиÑоваÑÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð´Ð¸Ð·Ð°Ð¹Ð½Ð° пÑиложениÑ, Ñем не менее, заÑÑавиÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð¾ÑпÑинимаÑÑ ÑобÑÑÐ¸Ñ Ð¿ÐµÑеÑаÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑо:
var dropbox;
dropbox = document.getElementById("dropbox");
dropbox.addEventListener("dragenter", dragenter, false);
dropbox.addEventListener("dragover", dragover, false);
dropbox.addEventListener("drop", drop, false);
Рданном пÑимеÑе Ð¼Ñ Ð¿ÑевÑаÑаем ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ID, ÑавнÑм dropbox
, в наÑÑ Ð·Ð¾Ð½Ñ Ð¿ÐµÑеÑаÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñи помоÑи Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑÑиков Ð´Ð»Ñ ÑобÑÑий dragenter
, dragover
и drop
.
РнаÑем ÑлÑÑае Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи делаÑÑ ÑÑо-Ñо оÑобенное пÑи обÑабоÑке ÑобÑÑий dragenter
и dragover
, Ñаким обÑазом, обе ÑÑнкÑии, оÑвеÑÑÑвеннÑе за обÑабоÑÐºÑ Ð´Ð°Ð½Ð½ÑÑ
ÑобÑÑий, доволÑно пÑоÑÑÑ. Ðни оÑÑанавливаÑÑ ÑаÑпÑоÑÑÑанение ÑобÑÑÐ¸Ñ Ð¸ пÑедоÑвÑаÑаÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ðµ дейÑÑÐ²Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ:
function dragenter(e) {
e.stopPropagation();
e.preventDefault();
}
function dragover(e) {
e.stopPropagation();
e.preventDefault();
}
ÐÑÑ Ð½Ð°ÑÑоÑÑÐ°Ñ Ð¼Ð°Ð³Ð¸Ñ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² ÑÑнкÑии drop()
:
function drop(e) {
e.stopPropagation();
e.preventDefault();
var dt = e.dataTransfer;
var files = dt.files;
handleFiles(files);
}
ÐдеÑÑ Ð¼Ñ Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÐ¼ из ÑобÑÑÐ¸Ñ Ð¿Ð¾Ð»Ðµ dataTransfer
, заÑем вÑÑаÑкиваем из него ÑпиÑок Ñайлов и пеÑедаÑм ÑÑÐ¾Ñ ÑпиÑок в handleFiles()
. ÐоÑле ÑÑого пÑоÑеÑÑ Ð¾Ð±ÑабоÑки Ñайлов одинаков вне завиÑимоÑÑи Ð¾Ñ Ñого, иÑполÑзовал ли полÑзоваÑÐµÐ»Ñ Ð´Ð»Ñ Ð¸Ñ
вÑбоÑа ÑÐ»ÐµÐ¼ÐµÐ½Ñ input
или ÑеÑ
Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ drag and drop.
ÐÑедÑÑавим, ÑÑо Ð²Ñ ÑазÑабаÑÑваеÑе оÑеÑедной веб-ÑÐ°Ð¹Ñ Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ÑоÑогÑаÑиÑми и Ð²Ñ Ñ
оÑиÑе иÑполÑзоваÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи HTML5 Ð´Ð»Ñ Ð¿ÑедваÑиÑелÑного пÑоÑмоÑÑа изобÑажений пеÑед Ñем, как полÑзоваÑÐµÐ»Ñ Ð·Ð°Ð³ÑÑÐ·Ð¸Ñ Ð¸Ñ
. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑоздаÑÑ input
ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð»Ð¸ Ð·Ð¾Ð½Ñ Ð¿ÐµÑеÑаÑкиваниÑ, как обÑÑждалоÑÑ Ñанее, и вÑзваÑÑ ÑакÑÑ ÑÑнкÑиÑ, как handleFiles()
ниже.
function handleFiles(files) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (!file.type.startsWith("image/")) {
continue;
}
var img = document.createElement("img");
img.classList.add("obj");
img.file = file;
preview.appendChild(img); // ÐÑедполагаеÑÑÑ, ÑÑо "preview" ÑÑо div, в коÑоÑом бÑÐ´ÐµÑ Ð¾ÑобÑажаÑÑÑÑ ÑодеÑжимое.
var reader = new FileReader();
reader.onload = (function (aImg) {
return function (e) {
aImg.src = e.target.result;
};
})(img);
reader.readAsDataURL(file);
}
}
ÐдеÑÑ Ð½Ð°Ñ Ñикл обÑабаÑÑÐ²Ð°ÐµÑ Ð²ÑбÑаннÑе полÑзоваÑелем ÑайлÑ, пÑовеÑÑÑ Ð°ÑÑибÑÑ type
Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñайла, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ ÑвлÑеÑÑÑ Ð»Ð¸ Ñайл изобÑажением (вÑполнÑеÑÑÑ ÑегÑлÑÑное вÑÑажение в ÑÑÑоке "image.*
"). ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñайла, коÑоÑÑй ÑвлÑеÑÑÑ Ð¸Ð·Ð¾Ð±Ñажением, Ð¼Ñ ÑоздаÑм новÑй img
ÑлеменÑ. Ðожно иÑполÑзоваÑÑ CSS Ð´Ð»Ñ ÑÑÑановки кÑаÑивÑÑ
Ñамок, Ñеней, и ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑазмеÑов изобÑажениÑ, но здеÑÑ Ð½ÐµÑ Ð½ÑÐ¶Ð´Ñ Ð´ÐµÐ»Ð°ÑÑ ÑÑого.
Ðаждое изобÑажение Ð¸Ð¼ÐµÐµÑ CSS клаÑÑ obj
добавленнÑй к Ð½ÐµÐ¼Ñ Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ поиÑка в DOM деÑеве. ÐÑ Ñакже добавили аÑÑибÑÑ file
к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¸Ð·Ð¾Ð±ÑажениÑ, Ñказав File
; ÑÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð½Ð°Ð¼ полÑÑиÑÑ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑакÑиÑеÑкой загÑÑзки позже. ÐаконеÑ, Ð¼Ñ Ð¸ÑполÑзÑем Node.appendChild()
Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð½Ð¾Ð²Ñй ÑÑкиз в облаÑÑÑ Ð¿ÑедпÑоÑмоÑÑа наÑего докÑменÑа.
ÐаÑем Ð¼Ñ ÑÑÑанавливаем FileReader
Ð´Ð»Ñ Ð¾Ð±ÑабоÑки аÑинÑ
Ñонной загÑÑзки изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ пÑикÑÐµÐ¿Ð»ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ к img
ÑлеменÑÑ. ÐоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обÑекÑа FileReader
, Ð¼Ñ Ð½Ð°ÑÑÑаиваем его ÑÑнкÑÐ¸Ñ onload
, заÑем вÑзÑваем readAsDataURL()
Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка опеÑаÑии ÑÑÐµÐ½Ð¸Ñ Ð² Ñоновом Ñежиме. Ðогда вÑÑ ÑодеÑжимое Ñайла изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð³ÑÑжено, они пÑеобÑазÑÑÑ ÐµÐ³Ð¾ в data:
URL, коÑоÑÑй пеÑедаÑÑÑÑ Ð² колбÑк onload
. ÐаÑа ÑеализаÑÐ¸Ñ ÑÑой пÑоÑедÑÑÑ Ð¿ÑоÑÑо ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð°ÑÑибÑÑ src
Ñ ÑлеменÑа img
загÑÑженного изобÑажениÑ, в ÑезÑлÑÑаÑе Ñего миниаÑÑÑа изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑвлÑеÑÑÑ Ð½Ð° ÑкÑане полÑзоваÑелÑ.
Gecko 2.0 пÑедÑÑавлÑÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð´Ð»Ñ Ð¼ÐµÑодов DOM window.URL.createObjectURL()
и window.URL.revokeObjectURL()
. Ðни позволÑÑÑ ÑоздаваÑÑ Ð¿ÑоÑÑÑе ÑÑÑоки URL, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº лÑбÑм даннÑм, на коÑоÑÑе можно ÑÑÑлаÑÑÑÑ, иÑполÑзÑÑ Ð¾Ð±ÑÐµÐºÑ DOM File
, вклÑÑÐ°Ñ Ð»Ð¾ÐºÐ°Ð»ÑнÑе ÑÐ°Ð¹Ð»Ñ Ð½Ð° компÑÑÑеÑе полÑзоваÑелÑ.
Ðогда Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð¾Ð±ÑÐµÐºÑ File
, на коÑоÑÑй Ð²Ñ Ñ
оÑиÑе ÑÑÑлаÑÑÑÑ Ð¿Ð¾ URL из HTML, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑоздаÑÑ Ð´Ð»Ñ ÑÑого обÑÐµÐºÑ URL, Ñакой как ÑÑоÑ:
var objectURL = window.URL.createObjectURL(fileObj);
URL обÑекÑа â ÑÑо ÑÑÑока, иденÑиÑиÑиÑÑÑÑÐ°Ñ Ð¾Ð±ÑÐµÐºÑ Ñайла File
. ÐаждÑй Ñаз пÑи вÑзове window.URL.createObjectURL()
, ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ñй ÑникалÑнÑй обÑÐµÐºÑ URL, даже еÑли Ð²Ñ Ñже Ñоздали обÑÐµÐºÑ URL Ð´Ð»Ñ ÑÑого Ñайла. ÐаждÑй из ниÑ
должен бÑÑÑ Ð¾ÑвобождÑн. Ð Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº они оÑвобождаÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки когда докÑÐ¼ÐµÐ½Ñ Ð²ÑгÑÑжаеÑÑÑ, еÑли ваÑа ÑÑÑаниÑа иÑполÑзÑÐµÑ Ð¸Ñ
динамиÑеÑки, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑвободиÑÑ Ð¸Ñ
Ñвно вÑзовом window.URL.revokeObjectURL()
:
window.URL.revokeObjectURL(objectURL);
ÐÑимеÑ: ÐÑполÑзование URL обÑекÑов Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñажений
ÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзÑÐµÑ URL обÑекÑов Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑкизов изобÑажений. ÐÑоме ÑÑого, оно показÑÐ²Ð°ÐµÑ Ð´ÑÑгÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑÐ°Ð¹Ð»Ð°Ñ , вклÑÑÐ°Ñ Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð° и ÑазмеÑÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе поÑмоÑÑеÑÑ ÑабоÑаÑÑий пÑимеÑ.
HTML, коÑоÑÑй пÑедÑÑавлÑÐµÑ Ð¸Ð½ÑеÑÑейÑ, вÑглÑÐ´Ð¸Ñ Ñак:
<input
type="file"
id="fileElem"
multiple
accept="image/*"
style="display:none"
onchange="handleFiles(this.files)" />
<a href="#" id="fileSelect">Select some files</a>
<div id="fileList">
<p>No files selected!</p>
</div>
ÐдеÑÑ Ð¾Ð¿ÑеделÑеÑÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñайла <input>
, а Ñакже ÑÑÑлка, коÑоÑÐ°Ñ Ð²ÑзÑÐ²Ð°ÐµÑ Ð¾ÐºÐ½Ð¾ вÑбоÑа Ñайла, Ñ.к. Ð¼Ñ Ñделали ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð²Ð¾Ð´Ð° Ñайла ÑкÑÑÑÑм, ÑÑÐ¾Ð±Ñ ÑÑÐ¾Ñ Ð½Ðµ ÑлиÑком пÑивлекаÑелÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð½ÑеÑÑейÑа не оÑобÑажалÑÑ. Ðб ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² Ñазделе ÐÑполÑзование меÑода click() ÑкÑÑÑÑÑ
ÑлеменÑов вÑбоÑа Ñайла, как о меÑоде вÑзова окна вÑбоÑа Ñайла.
ÐеÑод handleFiles()
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñеализован Ñаким обÑазом:
window.URL = window.URL || window.webkitURL;
var fileSelect = document.getElementById("fileSelect"),
fileElem = document.getElementById("fileElem"),
fileList = document.getElementById("fileList");
fileSelect.addEventListener(
"click",
function (e) {
if (fileElem) {
fileElem.click();
}
e.preventDefault(); // prevent navigation to "#"
},
false,
);
function handleFiles(files) {
if (!files.length) {
fileList.innerHTML = "<p>No files selected!</p>";
} else {
var list = document.createElement("ul");
for (var i = 0; i < files.length; i++) {
var li = document.createElement("li");
list.appendChild(li);
var img = document.createElement("img");
img.src = window.URL.createObjectURL(files[i]);
img.height = 60;
img.onload = function () {
window.URL.revokeObjectURL(this.src);
};
li.appendChild(img);
var info = document.createElement("span");
info.innerHTML = files[i].name + ": " + files[i].size + " bytes";
li.appendChild(info);
}
}
}
Ðн наÑинаеÑÑÑ Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑлеменÑа <div>
Ñ ID fileList
. ÐÑо блок, в коÑоÑÑй Ð¼Ñ Ð²ÑÑавим Ð½Ð°Ñ ÑпиÑок Ñайлов, вклÑÑÐ°Ñ ÑÑкизÑ..
ÐÑли обÑÐµÐºÑ FileList
, пеÑедаваемÑй в handleFiles()
ÑвлÑеÑÑÑ null
, Ñо Ð¼Ñ Ð¿ÑоÑÑо ÑÑÑанавливаем внÑÑÑенний HTML блока в оÑобÑажение ÑекÑÑа "No files selected!". ÐнаÑе Ð¼Ñ Ð½Ð°Ñинаем ÑÑÑоиÑÑ ÑпиÑок Ñайлов Ñаким обÑазом:
<ul>
).<div>
Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²Ñзова его меÑода element.appendChild()
.File
в FileList
, пÑедÑÑавлÑемого files
:
<li>
) и вÑÑавлÑем его в ÑпиÑок.<img>
).window.URL.createObjectURL()
Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ URL на двоиÑнÑй обÑекÑ.window.URL.revokeObjectURL()
, пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð² него ÑÑÑÐ¾ÐºÑ URL обÑекÑа, коÑоÑÐ°Ñ Ñказана в img.src
.ÐÑÑ Ð¾Ð´Ð½Ð° веÑÑ, коÑоÑÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе Ð·Ð°Ñ Ð¾ÑеÑÑ ÑделаÑÑ â ÑÑо позволиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð·Ð°Ð³ÑÑзиÑÑ Ð²ÑбÑаннÑй Ñайл или ÑÐ°Ð¹Ð»Ñ (Ñакие, как изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· пÑедÑдÑÑего пÑимеÑа) на ÑеÑвеÑ. ÐÑо можно ÑделаÑÑ Ð°ÑÐ¸Ð½Ñ Ñонно доволÑно пÑоÑÑо.
Создание заданий на загÑÑзкÑÐÑÐ¾Ð´Ð¾Ð»Ð¶Ð°Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼, коÑоÑÑй ÑÑÑоил ÑÑÐºÐ¸Ð·Ñ Ð² пÑедÑдÑÑем пÑимеÑе, напомним, ÑÑо ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑкиза пÑиÑвоен клаÑÑ CSS class obj
, Ñ ÑооÑвеÑÑÑвÑÑÑим File
, пÑикÑеплÑннÑм в аÑÑибÑÑ file
. ÐÑо позволÑÐµÑ Ð½Ð°Ð¼ оÑÐµÐ½Ñ Ð¿ÑоÑÑо вÑбÑаÑÑ Ð²Ñе изобÑажениÑ, коÑоÑÑе полÑзоваÑÐµÐ»Ñ Ð²ÑбÑал Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки иÑполÑзÑÑ Document.querySelectorAll()
, как показано здеÑÑ:
function sendFiles() {
var imgs = document.querySelectorAll(".obj");
for (var i = 0; i < imgs.length; i++) {
new FileUpload(imgs[i], imgs[i].file);
}
}
СÑÑока 2 полÑÑÐ°ÐµÑ NodeList
в пеÑеменнÑÑ imgs
Ñо вÑеми ÑлеменÑами докÑменÑа, имеÑÑиÑ
клаÑÑ CSS obj
. РнаÑем ÑлÑÑае вÑе они бÑдÑÑ ÑÑкизами изобÑажений. Ðак ÑолÑко Ð¼Ñ Ð¿Ð¾Ð»ÑÑим ÑÑÐ¾Ñ ÑпиÑок, можно пÑоÑÑо пÑойÑи по немÑ, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа новÑй ÑкземплÑÑ FileUpload
. ÐаждÑй из ниÑ
оÑвеÑÐ°ÐµÑ Ð·Ð° загÑÑÐ·ÐºÑ ÑооÑвеÑÑÑвÑÑÑего Ñайла.
ФÑнкÑÐ¸Ñ FileUpload
пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð° вÑ
од 2 паÑамеÑÑа: ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ Ñайл, из коÑоÑого нÑжно ÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе изобÑажениÑ.
function FileUpload(img, file) {
const reader = new FileReader();
this.ctrl = createThrobber(img);
const xhr = new XMLHttpRequest();
this.xhr = xhr;
const self = this;
this.xhr.upload.addEventListener(
"progress",
function (e) {
if (e.lengthComputable) {
const percentage = Math.round((e.loaded * 100) / e.total);
self.ctrl.update(percentage);
}
},
false,
);
xhr.upload.addEventListener(
"load",
function (e) {
self.ctrl.update(100);
const canvas = self.ctrl.ctx.canvas;
canvas.parentNode.removeChild(canvas);
},
false,
);
xhr.open(
"POST",
"https://demos.hacks.mozilla.org/paul/demos/resources/webservices/devnull.php",
);
xhr.overrideMimeType("text/plain; charset=x-user-defined-binary");
reader.onload = function (evt) {
xhr.send(evt.target.result);
};
reader.readAsBinaryString(file);
}
ФÑнкÑÐ¸Ñ FileUpload()
, Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð²ÑÑе, ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ Throbber, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ
ода загÑÑзки, а заÑем ÑоздаÑÑ XMLHttpRequest
Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³ÑÑзкой даннÑÑ
.
ÐеÑед наÑалом загÑÑзки даннÑÑ Ð²ÑполнÑÑÑÑÑ Ð½ÐµÑколÑко Ñагов Ð´Ð»Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовки:
XMLHttpRequest
ÑÑÑанавливаеÑÑÑ Ð¾Ð±ÑабоÑÑик ÑобÑÑÐ¸Ñ progress
Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑа Ñ
ода загÑÑзки новÑми знаÑениÑми пÑоÑенÑа вÑполнениÑ, Ñак ÑÑо по меÑе Ñ
ода загÑÑзки, индикаÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑÑÑ, оÑобÑÐ°Ð¶Ð°Ñ Ð¿Ð¾ÑледнÑÑ Ð¸Ð½ÑоÑмаÑиÑ.XMLHttpRequest
's ÑÑÑанавливаеÑÑÑ Ð¾Ð±ÑабоÑÑик ÑобÑÑÐ¸Ñ load
Ð´Ð»Ñ ÑÑÑановки индикаÑоÑа загÑÑзки в знаÑение 100%, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо индикаÑÐ¾Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно ÑÑÑановлен в 100% (в ÑлÑÑае пÑоблем деÑализаÑии в Ñ
оде пÑоÑеÑÑа). ÐаÑем обÑабоÑÑик ÑдалÑÐµÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑÐ¾Ñ Ð·Ð°Ð³ÑÑзки, Ñ.к. он более не нÑжен. ÐоÑÑÐ¾Ð¼Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑÐ¾Ñ Ð¸ÑÑÐµÐ·Ð°ÐµÑ ÐºÐ°Ðº ÑолÑко загÑÑзка завеÑÑена.XMLHttpRequest
's open()
Ð´Ð»Ñ Ð½Ð°Ñала ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ POST-запÑоÑа.XMLHttpRequest
overrideMimeType()
. Ð ÑÑом ÑлÑÑае Ð¼Ñ Ð¸ÑполÑзÑем обÑий Ñип MIME type; вам Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ñжно или не нÑжно вообÑе ÑÑÑанавливаÑÑ Ñип MIME в завиÑимоÑÑи Ð¾Ñ Ð²Ð°Ñего ÑлÑÑаÑ.FileReader
иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайла в двоиÑнÑÑ ÑÑÑокÑ.XMLHttpRequest
send()
Ð´Ð»Ñ Ð¾ÑпÑавки ÑодеÑжимого Ñайла.<?php
if (isset($_FILES['myFile'])) {
// Example:
move_uploaded_file($_FILES['myFile']['tmp_name'], "uploads/" . $_FILES['myFile']['name']);
exit;
}
?><!DOCTYPE html>
<html>
<head>
<title>dnd binary upload</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
function sendFile(file) {
var uri = "/index.php";
var xhr = new XMLHttpRequest();
var fd = new FormData();
xhr.open("POST", uri, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
// Handle response.
alert(xhr.responseText); // handle response.
}
};
fd.append('myFile', file);
// Initiate a multipart/form-data upload
xhr.send(fd);
}
window.onload = function() {
var dropzone = document.getElementById("dropzone");
dropzone.ondragover = dropzone.ondragenter = function(event) {
event.stopPropagation();
event.preventDefault();
}
dropzone.ondrop = function(event) {
event.stopPropagation();
event.preventDefault();
var filesArray = event.dataTransfer.files;
for (var i=0; i<filesArray.length; i++) {
sendFile(filesArray[i]);
}
}
}
</script>
</head>
<body>
<div>
<div id="dropzone" style="margin:30px; width:500px; height:300px; border:1px dotted grey;">Drag & drop your file here...</div>
</div>
</body>
</html>
ÐÑимеÑ: ÐÑполÑзование URL обÑекÑов Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ PDF
URL обÑекÑов могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð½Ðµ ÑолÑко Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñажений! Также ÑÑÐ¾Ñ Ð¿ÑиÑм можно иÑполÑзоваÑÑ Ð¸ Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ ÑеÑÑÑÑов, коÑоÑÑе могÑÑ Ð¾ÑобÑажаÑÑÑÑ Ð±ÑаÑзеÑом, напÑимеÑ, ÑÐ°Ð¹Ð»Ñ PDF.
Ð Firefox, Ð´Ð»Ñ Ñого ÑÑÐ¾Ð±Ñ Ñайл PDF поÑвилÑÑ Ð² iframe и не пÑедлагалÑÑ Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки, нÑжно ÑÑÑановиÑÑ pdfjs.disabled
в знаÑение false
Ðе ÑÑандаÑÑно .
<iframe id="viewer"></iframe>
РздеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ аÑÑибÑÑа src
:
var obj_url = window.URL.createObjectURL(blob);
var iframe = document.getElementById("viewer");
iframe.setAttribute("src", obj_url);
window.URL.revokeObjectURL(obj_url);
ÐÑимеÑ: ÐÑполÑзование URL обÑекÑов Ñ Ð´ÑÑгими Ñипами Ñайлов
ÐÑ Ð¼Ð¾Ð¶ÐµÑе Ñаким же обÑазом ÑабоÑаÑÑ Ñ Ñайлами в дÑÑÐ³Ð¸Ñ ÑоÑмаÑÐ°Ñ . Ðиже пÑиведÑн пÑÐ¸Ð¼ÐµÑ ÐºÐ°Ðº загÑÑжаеÑÑÑ Ð²Ð¸Ð´ÐµÐ¾:
var video = document.getElementById("video");
var obj_url = window.URL.createObjectURL(blob);
video.src = obj_url;
video.play();
window.URL.revokeObjectURL(obj_url);
СпеÑиÑикаÑии
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4