ã¡ã¢: ãã®æ©è½ã¯ã¦ã§ãã¯ã¼ã«ã¼å ã§å©ç¨å¯è½ã§ãã
ãã¡ã¤ã« API ã使ç¨ããã¨ãã¦ã§ãã³ã³ãã³ããã¦ã¼ã¶ã¼ã«ãã¼ã«ã«ãã¡ã¤ã«ã鏿ããããã«æç¤ºãããããã®ãã¡ã¤ã«ãèªã¿åããã¨ãã§ããããã«ãªãã¾ããããã®é¸æã¯ HTML ã® <input type="file">
è¦ç´ ã使ç¨ãããããã©ãã° & ãããããè¡ã£ãããããã¨ã§è¡ããã¨ãã§ãã¾ãã
ãã® HTML ããã£ãã¨ãã¾ãã
<input type="file" id="input" multiple />
ãã¡ã¤ã« API ã«ãããã¦ã¼ã¶ã¼ã鏿ãããã¡ã¤ã«ã表ã File
ãªãã¸ã§ã¯ããå«ã FileList
ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
multiple
屿§ã input
è¦ç´ ã«ä»ãããã¨ã§ãã¦ã¼ã¶ã¼ãè¤æ°ã®ãã¡ã¤ã«ã鏿ãããã¨ãã§ããããã«ãªãã¾ãã
æ§æ¥ã® DOM ã»ã¬ã¯ã¿ã¼ã使ã£ã¦ãæåã«é¸æããããã¡ã¤ã«ã«ã¢ã¯ã»ã¹ãã¾ãã
const selectedFile = document.getElementById("input").files[0];
change ã¤ãã³ãã§ã®é¸æããããã¡ã¤ã«ã¸ã®ã¢ã¯ã»ã¹
change
ã¤ãã³ããéã㦠FileList
ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ã (ãã ãå¿
é ã§ã¯ããã¾ãã)ããã®ããã« EventTarget.addEventListener()
ã使ã£ã¦ change
ã¤ãã³ãã®ãªã¹ãã¼ã追å ããå¿
è¦ãããã¾ãã
const inputElement = document.getElementById("input");
inputElement.addEventListener("change", handleFiles, false);
function handleFiles() {
const fileList = this.files; /* ãã¡ã¤ã«ãªã¹ããå¦çããã³ã¼ããããã«å
¥ã */
}
鏿ããããã¡ã¤ã«ã«ã¤ãã¦ã®æ
å ±ã®åå¾
DOM ãæä¾ãã FileList
ãªãã¸ã§ã¯ãã¯ãFile
ãªãã¸ã§ã¯ãã¨ãã¦æå®ããããã¦ã¼ã¶ã¼ã鏿ãããã¹ã¦ã®ãã¡ã¤ã«ããªã¹ãã¢ãããã¾ãããã¡ã¤ã«ãªã¹ãã® length
屿§ã®å¤ããã§ãã¯ãããã¨ã§ãã¦ã¼ã¶ã¼ã鏿ãããã¡ã¤ã«ã®æ°ãç¥ããã¨ãã§ãã¾ãã
const numFiles = fileList.length;
åã
ã® File
ãªãã¸ã§ã¯ãã¯ãåã«é
åã¨ãã¦ãªã¹ãã«ã¢ã¯ã»ã¹ããã ãã§åå¾ã§ãã¾ãã
File
ãªãã¸ã§ã¯ãã«ã¯ 3 ã¤ã®ããããã£ãããããã¡ã¤ã«ã«é¢ããæçãªæ
å ±ãå¾ããã¾ãã
name
èªã¿åãå°ç¨ã®æååã¨ãã¦ã®ãã¡ã¤ã«åãããã¯ãã¡ã¤ã«åã®ã¿ã§ããã¹ã«é¢ããæ å ±ã¯å«ã¾ãã¦ãã¾ããã
size
èªã¿åãå°ç¨ã® 64 ãããæ´æ°ã«ãããã¤ãåä½ã®ãã¡ã¤ã«ãµã¤ãºã§ãã
type
èªã¿åãå°ç¨ã®æååã¨ãã¦ã®ãã¡ã¤ã«ã® MIME ã¿ã¤ãã§ããMIME ã¿ã¤ããç¹å®ã§ããªãã¨ãã¯ç©ºæåå (""
) ã¨ãªãã¾ãã
次ã®ã³ã¼ã㯠size
ããããã£ãå©ç¨ããä¾ã§ãã
<!doctype html>
<html lang="ja-JP">
<head>
<meta charset="UTF-8" />
<title>ãã¡ã¤ã«ã®ãµã¤ãº</title>
</head>
<body>
<form name="uploadForm">
<div>
<input id="uploadInput" type="file" multiple />
<label for="fileNum">鏿ããããã¡ã¤ã«:</label>
<output id="fileNum">0</output>;
<label for="fileSize">åè¨ãµã¤ãº:</label>
<output id="fileSize">0</output>
</div>
<div><input type="submit" value="Send file" /></div>
</form>
<script>
const uploadInput = document.getElementById("uploadInput");
uploadInput.addEventListener(
"change",
() => {
// åè¨ãµã¤ãºãè¨ç®
let numberOfBytes = 0;
for (const file of uploadInput.files) {
numberOfBytes += file.size;
}
// æãè¿ãæ¥é è¾åä½ã«è¿ä¼¼
const units = [
"B",
"KiB",
"MiB",
"GiB",
"TiB",
"PiB",
"EiB",
"ZiB",
"YiB",
];
const exponent = Math.min(
Math.floor(Math.log(numberOfBytes) / Math.log(1024)),
units.length - 1,
);
const approx = numberOfBytes / 1024 ** exponent;
const output =
exponent === 0
? `${numberOfBytes} bytes`
: `${approx.toFixed(3)} ${
units[exponent]
} (${numberOfBytes} bytes)`;
document.getElementById("fileNum").textContent =
uploadInput.files.length;
document.getElementById("fileSize").textContent = output;
},
false,
);
</script>
</body>
</html>
click() ã¡ã½ããã使ç¨ãã¦é表示㮠input è¦ç´ ã使ç¨ãã
è¦ãç®ã®æªã <input>
è¦ç´ ãé表示ã«ããç¬èªã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãã¡ã¤ã«é¸æãéããã¦ã¼ã¶ã¼ã鏿ãããã¡ã¤ã«ã表示ãããã¨ãã§ãã¾ãã input è¦ç´ ã®ã¹ã¿ã¤ã«ã display:none
ã¨ãããã®ä¸ã§ click()
ã¡ã½ããã <input>
ã«å¯¾ãã¦å¼ã³åºããã¨ã§å®ç¾ã§ãã¾ãã
次ã®ãã㪠HTML ãèãã¦ã¿ã¾ãããã
<input
type="file"
id="fileElem"
multiple
accept="image/*"
style="display:none" />
<button id="fileSelect" type="button">
ããã¤ãã®ãã¡ã¤ã«ã鏿ãã¦ãã ããã
</button>
click
ã¤ãã³ããæ±ãã³ã¼ãã¯æ¬¡ã®ãããªãã®ã§ãã
const fileSelect = document.getElementById("fileSelect");
const fileElem = document.getElementById("fileElem");
fileSelect.addEventListener(
"click",
(e) => {
if (fileElem) {
fileElem.click();
}
},
false,
);
<button>
ã¯ã好ããªããã«ã¹ã¿ã¤ã«ä»ãã§ãã¾ãã
JavaScript (click() ã¡ã½ãã) ã使ç¨ããã«ãã¡ã¤ã«é¸æãéããããã«ããããã«ã <label>
è¦ç´ ã使ç¨ãã¾ãããã®å ´åã input è¦ç´ ã« display: none
(ã¾ã㯠visibility: hidden
) ãè¨å®ãã¦é表示ã«è¨å®ããã¨ãã©ãã«ããã¼ãã¼ãããã¢ã¯ã»ã¹ã§ããªããªãã¾ãã代ããã«ãè¦è¦çã«é表示ã«ããææ³ (visually-hidden technique) ã使ç¨ãã¾ãã
次㮠HTML ãè¦ã¦ãã ããã
<input
type="file"
id="fileElem"
multiple
accept="image/*"
class="visually-hidden" />
<label for="fileElem">ããã¤ãã®ãã¡ã¤ã«ã鏿ãã¦ãã ããã</label>
ããã¦ãã® CSS ã§ãã
.visually-hidden {
clip: rect(0 0 0 0);
clip-path: inset(50%);
height: 1px;
overflow: hidden;
position: absolute;
white-space: nowrap;
width: 1px;
}
input.visually-hidden:is(:focus, :focus-within) + label {
outline: thin dotted;
}
JavaScript ã³ã¼ãã追å ã㦠fileElem.click()
ãå¼ã³åºãå¿
è¦ã¯ããã¾ãããã¾ããã®å ´åã¯ãã©ãã«è¦ç´ ã®ã¹ã¿ã¤ã«ã叿ã©ããã«è¨å®ãããã¨ãã§ãã¾ããåä¾ã®ããã«ã¢ã¦ãã©ã¤ã³ã«è¨å®ããããbackground-color ã box-shadow ãè¨å®ããããã¦ãã©ãã«ã®é表示å
¥åãã£ã¼ã«ãã®ãã©ã¼ã«ã¹ã¹ãã¼ã¿ã¹ãè¦è¦çã«ç¤ºãå¿
è¦ãããã¾ãã(ãã®è¨äºãæ¸ãã¦ããæç¹ã§ã¯ã Firefox 㯠<input type="file">
è¦ç´ ã«å¯¾ãã¦ãã®è¦è¦çãªæãããã表示ãã¦ãã¾ããã)
ã¦ã¼ã¶ã¼ããã¡ã¤ã«ãã¦ã§ãã¢ããªã±ã¼ã·ã§ã³ã«ãã©ãã° & ãããããããã¨ãã§ãã¾ãã
æåã®ã¹ãããã¯ãããããã¾ã¼ã³ã確ç«ãããã¨ã§ããã³ã³ãã³ãã®ã©ã®é¨åããããããåãå ¥ãããã¯ãã¢ããªã±ã¼ã·ã§ã³ã®è¨è¨ã«ãã£ã¦ç°ãªãã¾ãããè¦ç´ ãããããã¤ãã³ããåãåããããã«ããã®ã¯ç°¡åã§ãã
let 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();
const dt = e.dataTransfer;
const files = dt.files;
handleFiles(files);
}
ããã§ã¯ãã¤ãã³ããã dataTransfer
ãã£ã¼ã«ããåå¾ãããããããã¡ã¤ã«ãªã¹ããåå¾ããããã handleFiles()
ã«æ¸¡ãã¾ããããããå
ã¯ãã¦ã¼ã¶ã¼ãå
¥åè¦ç´ ã使ç¨ããããã©ãã° & ããããã使ç¨ãããã©ããã«ãããããããã¡ã¤ã«ã®å¦çæ¹æ³ã¯å
¨ãåãã§ãã
次ã®ç´ æ´ãããåçå
±æãµã¤ããéçºãã¦ãã¦ãã¦ã¼ã¶ã¼ãå®éã«ç»åãã¢ãããã¼ãããåã« HTML ã使ã£ã¦ç»åã®ãµã ãã¤ã«ãã¬ãã¥ã¼ã表示ããããã¨ãã¾ããããåã«èª¬æããããã« input
è¦ç´ ãããããã¾ã¼ã³ãè¨å®ããæ¬¡ã® handleFiles()
ã®ãããªé¢æ°ãå¼ã³åºãã°è¯ãã®ã§ãã
function handleFiles(files) {
for (let i = 0; i < files.length; i++) {
const file = files[i];
if (!file.type.startsWith("image/")) {
continue;
}
const img = document.createElement("img");
img.classList.add("obj");
img.file = file;
preview.appendChild(img); // ããã¬ãã¥ã¼ãã¨ã¯ãã³ã³ãã³ãã表示ããã div åºåã®ãã¨ãæ³å®ãã¦ãã¾ãã
const reader = new FileReader();
reader.onload = (e) => {
img.src = e.target.result;
};
reader.readAsDataURL(file);
}
}
ããã§ã¯ãã¦ã¼ã¶ã¼ã鏿ãããã¡ã¤ã«ãå¦çããã«ã¼ããåãã¡ã¤ã«ã® type
屿§ãè¦ã¦ããã® MIME ã¿ã¤ãã image/
ã§å§ã¾ããã©ããã確èªãã¦ãã¾ããç»åã§ããåãã¡ã¤ã«ã«å¯¾ãã¦ãæ°ãã img
è¦ç´ ã使ãã¾ããCSS ã¯ãããããªå¢çç·ãå½±ãè¨å®ããããç»åã®ãµã¤ãºãæå®ãããããããã«ä½¿ç¨ãã¾ãã®ã§ãããã§ã¯å¿
è¦ããã¾ããã
åç»åã«ã¯ CSS ã¯ã©ã¹ obj
ã追å ããã¦ãããDOM ããªã¼ã§ç°¡åã«è¦ã¤ãããã¨ãã§ãã¾ããã¾ããåç»åã« file
屿§ã追å ããç»åã® File
ãæå®ãã¦ãã¾ããããã«ãããå¾ã§å®éã«ã¢ãããã¼ãããç»åãåå¾ãããã¨ãã§ãã¾ããNode.appendChild()
ã使ç¨ãã¦ãææ¸ã®ãã¬ãã¥ã¼é åã«æ°ãããµã ãã¤ã«ã追å ãã¾ãã
次ã«ãç»åã®èªã¿è¾¼ã¿ã¨ img
è¦ç´ ã¸ã®ã¢ã¿ãããéåæã§å¦çããããã® FileReader
ã確ç«ãã¾ããæ°ãã FileReader
ãªãã¸ã§ã¯ãã使ããå¾ããã® onload
颿°ãè¨å®ããreadAsDataURL()
ãå¼ã³åºãã¦ããã¯ã°ã©ã¦ã³ãã§èªã¿è¾¼ã¿å¦çãéå§ãã¾ããç»åãã¡ã¤ã«ã®ã³ã³ãã³ãå
¨ä½ãèªã¿è¾¼ã¾ããã¨ãããã㯠data:
URL ã«å¤æãããonload
ã³ã¼ã«ããã¯ã«æ¸¡ããã¾ãããã®ã«ã¼ãã³ã®å®è£
ã§ã¯ãimg
è¦ç´ ã® src
屿§ãèªã¿è¾¼ã¾ããç»åã«è¨å®ããããã®çµæãç»åãã¦ã¼ã¶ã¼ã®ç»é¢ã®ãµã ãã¤ã«ã«è¡¨ç¤ºããã¾ãã
DOM ã® URL.createObjectURL()
㨠URL.revokeObjectURL()
ã¡ã½ããã使ç¨ããã¨ãã¦ã¼ã¶ã¼ã®ã³ã³ãã¥ã¼ã¿ã¼ä¸ã®ãã¼ã«ã«ãã¡ã¤ã«ãªã©ãDOM File
ãªãã¸ã§ã¯ãã使ç¨ãã¦åç
§å¯è½ãªãããããã¼ã¿ãåç
§ããããã«ä½¿ç¨ã§ããã·ã³ãã«ãª URL æååã使ã§ãã¾ãã
HTML ãã URL ã§åç
§ããã File
ãªãã¸ã§ã¯ããããå ´åã¯ã次ã®ããã«ãªãã¸ã§ã¯ã URL ã使ãã¾ãã
const objectURL = window.URL.createObjectURL(fileObj);
ãªãã¸ã§ã¯ã URL 㯠File
ãªãã¸ã§ã¯ããèå¥ããæååã§ãã URL.createObjectURL()
ãå¼ã³åºããã³ã«ããã§ã«ãã®ãã¡ã¤ã«ã®ãªãã¸ã§ã¯ã URL ã使ãã¦ãã¦ãã䏿ã®ãªãã¸ã§ã¯ã URL ã使ããã¾ãããããã¯ããããè§£é¤ããå¿
è¦ãããã¾ãããããã¯ããã¥ã¡ã³ããã¢ã³ãã¼ããããã¨èªåçã«è§£æ¾ããã¾ããããã¼ã¸ãåçã«ãããã使ç¨ãã¦ããå ´å㯠URL.revokeObjectURL()
ãå¼ã³åºãã¦æç¤ºçã«è§£æ¾ããå¿
è¦ãããã¾ãã
URL.revokeObjectURL(objectURL);
ä¾: ãªãã¸ã§ã¯ã URL ã§ç»åã表示
ãã®ä¾ã§ã¯ããªãã¸ã§ã¯ã URL ã使ç¨ãã¦ç»åã®ãµã ãã¤ã«ã表示ãã¦ãã¾ããããã«ããã¡ã¤ã«åããµã¤ãºãªã©ã®ä»ã®ãã¡ã¤ã«æ å ±ã表示ãã¾ãã
ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¨ãªã HTML ã¯æ¬¡ã®ããã«ãªãã¾ãã
<input
type="file"
id="fileElem"
multiple
accept="image/*"
style="display:none" />
<a href="#" id="fileSelect">ããã¤ãã®ãã¡ã¤ã«ã鏿ãã¦ãã ããã</a>
<div id="fileList">
<p>ãã¡ã¤ã«ã鏿ããã¦ãã¾ããã</p>
</div>
ããã«ããããã¡ã¤ã« <input>
è¦ç´ ã¨ããã¡ã¤ã«é¸æãå¼ã³åºããªã³ã¯ã確ç«ããã¾ã (ãã¾ãç¾ãããªããã¡ã¤ã«å
¥åãé表示ã«ãããã)ãããã¯ããã¡ã¤ã«é¸æãå¼ã³åºãã¡ã½ããã¨åæ§ã«ãclick() ã¡ã½ããã使ç¨ãã¦é表示㮠input è¦ç´ ã使ç¨ããã®ç¯ã§èª¬æããã¦ãã¾ãã
handleFiles()
ã¡ã½ããã¯æ¬¡ã®ããã«ãªãã¾ãã
const fileSelect = document.getElementById("fileSelect"),
fileElem = document.getElementById("fileElem"),
fileList = document.getElementById("fileList");
fileSelect.addEventListener(
"click",
(e) => {
if (fileElem) {
fileElem.click();
}
e.preventDefault(); // "#" ã¸ã®ç§»åãé²ã
},
false,
);
fileElem.addEventListener("change", handleFiles, false);
function handleFiles() {
fileList.textContent = "";
if (!this.files.length) {
const p = document.createElement("p");
p.textContent = "ãã¡ã¤ã«ã鏿ããã¦ãã¾ããã";
fileList.appendChild(p);
} else {
const list = document.createElement("ul");
fileList.appendChild(list);
for (let i = 0; i < this.files.length; i++) {
const li = document.createElement("li");
list.appendChild(li);
const img = document.createElement("img");
img.src = URL.createObjectURL(this.files[i]);
img.height = 60;
li.appendChild(img);
const info = document.createElement("span");
info.textContent = `${this.files[i].name}: ${this.files[i].size} ãã¤ã`;
li.appendChild(info);
}
}
}
ããã¯ã <div>
ã® URL ã fileList
ã¨ãã ID ã§åå¾ãããã¨ããå§ã¾ãã¾ããããã¯ããµã ãã¤ã«ãå«ããã¡ã¤ã«ãªã¹ããæ¿å
¥ãããããã¯ã§ãã
handleFiles()
ã«æ¸¡ããã FileList
ãªãã¸ã§ã¯ãã空ã®å ´åããããã¯ã®å
é¨ HTML ã«ããã¡ã¤ã«ã鏿ããã¦ãã¾ãããã¨è¡¨ç¤ºããããã«è¨å®ãã¾ããããã§ãªãå ´åã¯ã次ã®ããã«ãã¡ã¤ã«ãªã¹ãã®æ§ç¯ãéå§ãã¾ãã
<ul>
) è¦ç´ ã使ãã¾ãã<div>
ãããã¯ã®ä¸ã« Node.appendChild()
ã¡ã½ãããå¼ã³åºããã¨ã§æ¿å
¥ããã¾ããfiles
ã§è¡¨ããã FileList
å
ã®ããããã® File
ã«å¯¾ãã¦æ¬¡ã®å¦çãå®è¡ãã¾ãã
<li>
) è¦ç´ ã使ãããªã¹ãã«æ¿å
¥ãã¾ãã<img>
) è¦ç´ ã使ãã¾ããURL.createObjectURL()
ãç¨ãã¦ãBlob ã® URL ã使ãã¦ãç»åã®ã½ã¼ã¹ããã¡ã¤ã«ãè¡¨ãæ°ãããªãã¸ã§ã¯ã URL ã«è¨å®ãã¾ããä¸ã®ã³ã¼ãã®ã©ã¤ããã¢ã¯ãã¡ãã§ãã
ç»åãèªã¿è¾¼ã¾ããç´å¾ã«ãªãã¸ã§ã¯ã URL ãããã«åãæ¶ããªããã¨ã«æ³¨æãã¦ãã ãããããããã¨ãã¦ã¼ã¶ã¼ãç»åã«å¯¾ãã¦æä½ï¼å³ã¯ãªãã¯ãã¦ç»åãä¿åããããæ°ããã¿ãã§éããããªã©ï¼ãã§ããªããªã£ã¦ãã¾ãã¾ããé·å¯¿å½ã®ã¢ããªã±ã¼ã·ã§ã³ã§ã¯ããªãã¸ã§ã¯ã URL ãä¸è¦ã«ãªã£ãå ´åï¼ç»åã DOM ããé¤å»ãããå ´åãªã©ï¼ã«ã URL.revokeObjectURL()
ã¡ã½ãããå¼ã³åºãããªãã¸ã§ã¯ã URL æååãæ¸¡ãã¦ãã¡ã¢ãªã¼ãè§£æ¾ããããã«ãªãã¸ã§ã¯ã URL ãç¡å¹ã«ããå¿
è¦ãããã¾ãã
ãã®ä¾ã§ã¯ãã¦ã¼ã¶ã¼ããã¡ã¤ã«ï¼ä¾ãã°ãååã®ä¾ã§ä½¿ç¨ãã鏿ããç»åï¼ããµã¼ãã¼ã«ã¢ãããã¼ãããæ¹æ³ã示ãã¾ãã
ã¡ã¢: é常ã HTTP ãªã¯ã¨ã¹ããè¡ãããã«ã¯ããã§ãã API ã XMLHttpRequest
ã®ä»£ããã«ä½¿ç¨ãããã¨ããå§ããã¾ãããã ãããã®ä¾ã§ã¯ãã¦ã¼ã¶ã¼ã«ã¢ãããã¼ãã®é²è¡ç¶æ³ã表示ãããã®ã§ããããã®æ©è½ã¯ãã§ãã API ã§ã¯ã¾ã 対å¿ãã¦ããªãããã XMLHttpRequest
ã使ç¨ãã¦ãã¾ãã
ãã§ãã API ã使ç¨ããé²è¡ç¶æ³ã®éç¥ã®æ¨æºåã«é¢ããåãçµã¿ã¯ã https://github.com/whatwg/fetch/issues/607 ã§è¡ããã¦ãã¾ãã
ã¢ãããã¼ãã¿ã¹ã¯ã®çæåã®ä¾ã§ãµã ãã¤ã«ã使ããã³ã¼ãã®ç¶ãã§ããã¹ã¦ã®ãµã ãã¤ã«ç»åã CSS ã¯ã©ã¹ obj
ã«ããã対å¿ãã File
ã file
屿§ã«æ·»ä»ããã¦ãããã¨ãæãåºãã¦ãã ãããããã«ããããã®ããã«Document.querySelectorAll()
ã使ç¨ãã¦ãã¦ã¼ã¶ã¼ãã¢ãããã¼ãããããã«é¸æããç»åããã¹ã¦é¸æãããã¨ãã§ãã¾ãã
function sendFiles() {
const imgs = document.querySelectorAll(".obj");
for (let i = 0; i < imgs.length; i++) {
new FileUpload(imgs[i], imgs[i].file);
}
}
document.querySelectorAll
ã§ã¯ 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",
(e) => {
if (e.lengthComputable) {
const percentage = Math.round((e.loaded * 100) / e.total);
self.ctrl.update(percentage);
}
},
false,
);
xhr.upload.addEventListener(
"load",
(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 = (evt) => {
xhr.send(evt.target.result);
};
reader.readAsBinaryString(file);
}
function createThrobber(img) {
const throbberWidth = 64;
const throbberHeight = 6;
const throbber = document.createElement("canvas");
throbber.classList.add("upload-progress");
throbber.setAttribute("width", throbberWidth);
throbber.setAttribute("height", throbberHeight);
img.parentNode.appendChild(throbber);
throbber.ctx = throbber.getContext("2d");
throbber.ctx.fillStyle = "orange";
throbber.update = (percent) => {
throbber.ctx.fillRect(
0,
0,
(throbberWidth * percent) / 100,
throbberHeight,
);
if (percent === 100) {
throbber.ctx.fillStyle = "green";
}
};
throbber.update(0);
return throbber;
}
ä¸ã® FileUpload()
颿°ã¯ã鲿æ
å ±ã表示ããããã® throbber ã使ãããã¼ã¿ã®ã¢ãããã¼ããå¦çããããã® XMLHttpRequest
ã使ãã¾ãã
å®éã«ãã¼ã¿ã転éããåã«ãããã¤ãã®æºå段éãããã¾ãã
XMLHttpRequest
ã®ã¢ãããã¼ã progress
ãªã¹ãã¼ã¯ãã¢ãããã¼ãã®é²æã«å¿ãã¦ææ°ã®æ
å ±ã«åºã¥ã㦠throbber ãæ´æ°ãããããã«ãæ°ãããã¼ã»ã³ãå¤ã®æ
å ±ã§ throbber ãæ´æ°ããããã«è¨å®ããã¦ãã¾ããXMLHttpRequest
ã®ã¢ãããã¼ã load
ã¤ãã³ããã³ãã©ã¼ã¯ã鲿ã¤ã³ã¸ã±ã¼ã¿ã¼ãå®éã« 100 % ã«éãããã¨ã確èªããããã«ãthrobber ã®é²ææ
å ±ã 100% ã«æ´æ°ããããã«è¨å®ããã¦ãã¾ã (ããã»ã¹ä¸ã«ç²åº¦ã®ã¯ã»ãããå ´å)ãããã¦ãå¿
è¦ããªããªãã° throbber ãåé¤ãã¾ããããã«ãããã¢ãããã¼ããå®äºãã㨠throbber ãæ¶ãã¾ããXMLHttpRequest
ã® open()
ã¡ã½ãããå¼ã³åºã㦠POST ãªã¯ã¨ã¹ããçæãããã¨ã§éå§ããã¾ããXMLHttpRequest
颿°ã® overrideMimeType()
ãå¼ã³åºãã¦è¨å®ãã¾ãããã®å ´åãä¸è¬ç㪠MIME ã¿ã¤ãã使ç¨ãã¦ãã¾ããç¨éã«ãã£ã¦ã¯ MIME ã¿ã¤ããè¨å®ããå¿
è¦ããªãå ´åãããã¾ããFileReader
ãªãã¸ã§ã¯ãã使ç¨ãã¦ããã¡ã¤ã«ããã¤ããªã¼æååã«å¤æãã¾ãXMLHttpRequest
颿°ã® send()
ãå¼ã³åºããããã¡ã¤ã«ã®ã³ã³ãã³ããã¢ãããã¼ãããã¾ãããã®ä¾ã§ã¯ããµã¼ãã¼å´ã§ PHP ã使ç¨ããã¯ã©ã¤ã¢ã³ãå´ã§ JavaScript ã使ç¨ãã¦ããã¡ã¤ã«ã®éåæã¢ãããã¼ãã宿¼ãã¦ãã¾ãã
<?php
if (isset($_FILES["myFile"])) {
// Example:
move_uploaded_file($_FILES["myFile"]["tmp_name"], "uploads/" . $_FILES["myFile"]["name"]);
exit;
}
?><!doctype html>
<html lang="ja-JP">
<head>
<meta charset="UTF-8" />
<title>dnd binary upload</title>
<script>
function sendFile(file) {
const uri = "/index.php";
const xhr = new XMLHttpRequest();
const fd = new FormData();
xhr.open("POST", uri, true);
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
alert(xhr.responseText); // ã¬ã¹ãã³ã¹ãå¦ç
}
};
fd.append("myFile", file);
// multipart/form-data ã®ã¢ãããã¼ããéå§ãã
xhr.send(fd);
}
window.onload = () => {
const dropzone = document.getElementById("dropzone");
dropzone.ondragover = dropzone.ondragenter = (event) => {
event.stopPropagation();
event.preventDefault();
};
dropzone.ondrop = (event) => {
event.stopPropagation();
event.preventDefault();
const filesArray = event.dataTransfer.files;
for (let 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;">
ããã«ãã¡ã¤ã«ããã©ãã° & ãããããã¦ãã ãã
</div>
</div>
</body>
</html>
ä¾: ãªãã¸ã§ã¯ã URL ã使ç¨ã㦠PDF ã表示
ãªãã¸ã§ã¯ã URL ã¯ç»å以å¤ã«ã使ç¨ã§ãã¾ããåãè¾¼ã¾ãã PDF ãã¡ã¤ã«ãããã©ã¦ã¶ã¼ã§è¡¨ç¤ºå¯è½ãªä»ã®ãªã½ã¼ã¹ã表示ããããã«ä½¿ç¨ã§ãã¾ãã
Firefox ã§ã¯ã PDF ã iframe å
ã«åãè¾¼ã¾ãã¦è¡¨ç¤ºãããããã«ããã«ã¯ (ãã¦ã³ãã¼ããã¡ã¤ã«ã¨ãã¦ææ¡ãããã®ã§ã¯ãªã)ãpdfjs.disabled
ã®è¨å®ã false
ã«è¨å®ããå¿
è¦ãããã¾ãã
<iframe id="viewer"></iframe>
ããã¦ãsrc
屿§ã®å¤æ´ç¹ã¯ãã¡ãã§ãã
const objURL = URL.createObjectURL(blob);
const iframe = document.getElementById("viewer");
iframe.setAttribute("src", objURL);
// å¾ã§:
URL.revokeObjectURL(objURL);
ä¾: ä»ã®ãã¡ã¤ã«å½¢å¼ã§ã®ãªãã¸ã§ã¯ã URL ã®ä½¿ç¨
ä»ã®å½¢å¼ã®ãã¡ã¤ã«ãåãããã«æä½ã§ãã¾ããããã§ã¯ãã¢ãããã¼ããããåç»ããã¬ãã¥ã¼ããæ¹æ³ãç´¹ä»ãã¾ãã
const video = document.getElementById("video");
const objURL = URL.createObjectURL(blob);
video.src = objURL;
video.play();
// å¾ã§:
URL.revokeObjectURL(objURL);
é¢é£æ
å ±
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