夿³¨ï¼ æ¤ç¹æ§å¨ Web Worker ä¸å¯ç¨ã
éè¿ä½¿ç¨æä»¶ APIï¼web å
容å¯ä»¥è¦æ±ç¨æ·éæ©æ¬å°æä»¶ï¼ç¶å读åè¿äºæä»¶çå
容ãè¿ç§éæ©å¯ä»¥éè¿ä½¿ç¨ HTML <input type="file">
å
ç´ æéè¿ææ¾æ¥å®æã
èèè¿æ®µ HTML 代ç ï¼
<input type="file" id="input" multiple />
éè¿æä»¶ APIï¼æä»¬å¯ä»¥è®¿é® FileList
ï¼å®å
å«äºè¡¨ç¤ºç¨æ·æéæä»¶ç File
对象ã
input
å
ç´ ç multiple
屿§å
è®¸ç¨æ·éæ©å¤ä¸ªæä»¶ã
使ç¨ä¼ ç»ç 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 = files.length;
å¯ä»¥åæ°ç»ä¸æ ·ç®åå°è®¿é®æä»¶åè¡¨æ¥æ£ç´¢å个 File
对象ã
File
对象æä¾äºä¸ä¸ªå±æ§ï¼å
å«äºå
³äºæä»¶çæç¨ä¿¡æ¯ã
name
æä»¶åç§°ï¼åªè¯»å符串ãåªå 嫿件åï¼ä¸å å«ä»»ä½è·¯å¾ä¿¡æ¯ã
size
以åèæ°ä¸ºåä½çæä»¶å¤§å°ï¼åªè¯»ç 64 使´æ°ã
type
æä»¶ç MIME ç±»åï¼åªè¯»å符串ï¼å½ç±»åä¸è½ç¡®å®æ¶ä¸º ""
ã
ä¸é¢çä¾åå±ç¤ºäº size
屿§çä¸ç§å¯è½ç¨æ³ï¼
<!doctype html>
<html lang="zh-CN">
<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="ä¸ä¼ æä»¶" /></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} åè`
: `${approx.toFixed(3)} ${
units[exponent]
}ï¼${numberOfBytes} åèï¼`;
document.getElementById("fileNum").textContent =
uploadInput.files.length;
document.getElementById("fileSize").textContent = output;
},
false,
);
</script>
</body>
</html>
éè¿ click() æ¹æ³ä½¿ç¨éèçæä»¶ input å
ç´
ä½ å¯ä»¥éèå
¬è®¤é¾ççæä»¶ <input>
å
ç´ å¹¶æ¾ç¤ºä½ èªå·±çç颿¥æå¼æä»¶éæ©å¨ï¼ç¶åæ¾ç¤ºåªä¸ªæåªäºæä»¶è¢«ç¨æ·éä¸äºãä½ å¯ä»¥éè¿ç» input å
ç´ æ·»å display:none
çæ ·å¼ï¼åè°ç¨ <input>
å
ç´ ç click()
æ¹æ³æ¥å®ç°ã
èèè¿æ®µ 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 ææ¯ä»£æ¿ã
èèè¿æ®µ 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()
ï¼ä½ ä¹å¯ä»¥ç» label å
ç´ æ·»å ä½ æ³è¦çæ ·å¼ãä½ éè¦å¨å
¶ label 䏿ä¾éè input åæ®µçç¦ç¹ç¶æçè§è§æç¤ºï¼æ¯å¦ä¸é¢ç¨çè½®å»ï¼æè
èæ¯é¢è²æè¾¹æ¡é´å½±ãï¼æªè³ç¼åæ¶ä¸ºæ¢ï¼Firefox 䏿¾ç¤º <input type="file">
å
ç´ çè§è§æç¤ºãï¼
ä½ è¿å¯ä»¥è®©ç¨æ·å°æä»¶ææ½å°ä½ ç web åºç¨ä¸ã
ç¬¬ä¸æ¥æ¯å建ä¸ä¸ª drop åºåãè½ç¶ä½ ç½é¡µå 容çåªé¨åæ¥åææ¾åå³äºä½ çåºç¨è®¾è®¡ï¼ä½æ¯ä½¿ä¸ä¸ªå ç´ æ¥æ¶ drop äºä»¶æ¯å¾å®¹æçã
let dropbox;
dropbox = document.getElementById("dropbox");
dropbox.addEventListener("dragenter", dragenter, false);
dropbox.addEventListener("dragover", dragover, false);
dropbox.addEventListener("drop", drop, false);
å¨è¿ä¸ªä¾åä¸ï¼æä»¬å° ID 为 dropbox
çå
ç´ åä¸ºäºæä»¬ç drop åºåãè¿æ¯éè¿ç»å
ç´ æ·»å 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()
彿°ãå¨è¿ä¹åï¼å¤çæä»¶çæ¹æ³åç¨ input
å
ç´ æè
ç¨ææ½å°±æ¯ä¸æ ·çäºã
æ¯æ¹è¯´ï¼ä½ æ£å¨å¼åä¸ä¸ªç«é
·çä¸ä¸ä»£å¾çå享ç½ç«ï¼å¹¶ä¸æ³ä½¿ç¨ HTML æ¥å±ç¤ºç¨æ·å¨å®é
ä¸ä¼ ä¹åçå¾çç缩ç¥å¾ãä½ å¯ä»¥åæä»¬ä¹å讨论ç飿 ·å建èªå·±ç input å
ç´ æè
drop åºåï¼ç¶å对å®ä»¬ä½¿ç¨ä¸ä¸ªåè°å½æ°ï¼æ¯å¦ä¸é¢ç 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); // å设âpreviewâå°±æ¯ç¨æ¥æ¾ç¤ºå
容ç div
const reader = new FileReader();
reader.onload = (e) => {
img.src = e.target.result;
};
reader.readAsDataURL(file);
}
}
è¿éæä»¬å¾ªç¯å¤çç¨æ·éæ©çæä»¶ï¼çæ¯ä¸ªæä»¶ç type
屿§æ¯ä¸æ¯ä»¥ image/
å¼å¤´ã对æ¯ä¸ªæä»¶èè¨ï¼å¦æå®æ¯å¾çï¼æä»¬å°±å建ä¸ä¸ªæ°ç img
å
ç´ ãå¯ä»¥ä½¿ç¨ CSS æ¥å建ä¸ä¸ªæ¼äº®çè¾¹æ¡æé´å½±æ¥æ¾ç¤ºå¾ççå
·ä½å¤§å°ï¼å¨è¿å¿å°±ä¸å
·ä½åäºã
为äºå¨ DOM æ 䏿´å®¹æå°æ¾å°ä»ä»¬ï¼æ¯ä¸ªå¾çå
ç´ é½è¢«æ·»å äºä¸ä¸ªå为 obj
ç CSS ç±»ãæä»¬è¿ç»æ¯ä¸ªå¾çæ·»å äº file
屿§ä»¥æå®å
¶ File
屿§ï¼è¿æ ·åå¯ä»¥è®©æä»¬æ¿å°ç¨åéè¦å®é
ä¸ä¼ çå¾çãæä»¬å¨é¢è§é¡µä¸ä½¿ç¨ Node.appendChild()
æ¥æ·»å æ°ç缩ç¥å¾ã
æ¥ä¸æ¥ï¼æä»¬åå»ºäº FileReader
æ¥å¤ç弿¥çå¾çå 载并æå®èµç» img
å
ç´ ãå¨å建ä¸ä¸ªæ°ç FileReader
对象åï¼æä»¬è®¾å®äºå®ç onload
彿°ï¼ç¶åè°ç¨ readAsDataURL()
彿°å¼å§åå°è¯»åæä»¶ã彿´ä¸ªå¾çæä»¶çå
容é½è¢«å
¨é¨å è½½å®åï¼å®ä»¬è¢«è½¬æ¢æäºä¸ä¸ªè¢«ä¼ éå° onload
åè°å½æ°ç data:
URLãæä»¬å¯¹è¿ä¸ªç¨åºçå®ç°æ¯å° img
å
ç´ ç src
屿§è®¾ç½®ä¸ºå è½½çå¾çï¼ä»è使å¾çåºç°å¨ç¨æ·å±å¹ç缩ç¥å¾ä¸ã
DOM ç URL.createObjectURL()
å URL.revokeObjectURL()
æ¹æ³è®©ä½ å建ç®åç URL å符串ï¼å¯ä»¥ç¨æ¥å¼ç¨ä»»ä½å¯ä»¥ç¨ DOM File
对象å¼ç¨çæ°æ®ï¼å
æ¬ç¨æ·çµèä¸çæ¬å°æä»¶ã
å½ä½ éè¦å¨ HTML ä¸éè¿ URL æ¥å¼ç¨ä¸ä¸ª File
对象æ¶ï¼ä½ å¯ä»¥å建ä¸ä¸ªå¯¹è±¡ URLï¼å°±åè¿æ ·ï¼
const objectURL = window.URL.createObjectURL(fileObj);
è¿ä¸ªå¯¹è±¡ URL æ¯ä¸ä¸ªæ è¯ File
对象çåç¬¦ä¸²ãæ¯æ¬¡ä½ è°ç¨ URL.createObjectURL()
ï¼é½ä¼å建ä¸ä¸ªå¯ä¸ç对象 URLï¼å³ä½¿ä½ å·²ç»ä¸ºè¯¥æä»¶å建äºä¸ä¸ªå¯¹è±¡ 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>
å
ç´ ï¼ä»¥åè°ç¨æä»¶éåå¨ç龿¥ï¼å 为æä»¬ææä»¶ 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;
img.onload = () => {
URL.revokeObjectURL(img.src);
};
li.appendChild(img);
const info = document.createElement("span");
info.textContent = `${this.files[i].name}ï¼${this.files[i].size} åè`;
li.appendChild(info);
}
}
}
é¦å
ï¼è·å ID 为 fileList
ç <div>
ãè¿ä¸ªåºåéæä»¬ä¼æå
¥æä»¬çæä»¶å表ï¼å
æ¬ç¼©ç¥å¾ã
å¦æä¼ å
¥ handleFiles()
ç FileList
对象å¼ä¸ºç©ºæ¶ï¼æä»¬åªè¦ç®åå°è¿åçå
é¨ HTML 为æ¾ç¤ºâ没æéæ©ä»»ä½æä»¶ï¼âãå¦åï¼æä»¬å°±éè¦åä¸é¢è¿æ ·ç¼åæä»¬çæä»¶å表ï¼
<ul>
ï¼å
ç´ ãNode.appendChild()
æ¹æ³æ¥å°æ°çå表å
ç´ æå
¥å° <div>
åãfiles
代表çæä»¶éå FileList
ä¸çæ¯ä¸ª File
ï¼
<li>
ï¼å
ç´ å¹¶æå
¥å°å表ä¸ã<img>
ï¼å
ç´ ãURL.createObjectURL()
æ¥å建 blob URLãURL.revokeObjectURL()
æ¹æ³å¹¶ä¸ä¼ é img.src
ä¸ç对象 URL å符串æ¥å®ç°ãè¿æ¯ä¸é¢ä»£ç çä¸ä¸ªå¨çº¿ç¤ºä¾ï¼
示ä¾ï¼ä¸ä¼ ä¸ä¸ªç¨æ·éæ©çæä»¶æ¤ç¤ºä¾å±ç¤ºäºå¦ä½è®©ç¨æ·å°æä»¶ï¼ä¾å¦ä½¿ç¨ä¸ä¸ä¸ªç¤ºä¾éæ©çå¾åï¼ä¸ä¼ å°æå¡å¨ã
夿³¨ï¼ é常æå¥½ä½¿ç¨ Fetch API è䏿¯ XMLHttpRequest
åèµ· HTTP 请æ±ã使¯ï¼å¨è¿ç§æ
åµä¸ï¼æä»¬æ³åç¨æ·æ¾ç¤ºä¸ä¼ è¿åº¦ï¼è Fetch API ä»ç¶ä¸æ¯ææ¤ç¹æ§ï¼å æ¤ç¤ºä¾ä½¿ç¨ XMLHttpRequest
ãä½¿ç¨ Fetch 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
çå
ç´ ç NodeList
ï¼å½å为 imgs
ã卿们çä¾åä¸ï¼è¿äºæ¯å
嫿æå¾å缩ç¥å¾çå表ãæäºè¿ä¸ªå表ï¼éå并为æ¯ä¸é¡¹å建ä¸ä¸ªæ°ç FileUpload
å®ä¾å°±å¾ç®åäºãæ¯ä¸ªå®ä¾é½å¯ä»¥å¤çç¸åºæä»¶çä¸ä¼ ã
FileUpload
彿°æ¥å两个è¾å
¥ï¼ä¸ä¸ª image å
ç´ åä¸ä¸ªå
å«å¾åæ°æ®çæä»¶ã
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()
彿°å建äºä¸ä¸ªâå è½½ä¸âæç¤ºå¨ï¼ç¨äºæ¾ç¤ºè¿åº¦ä¿¡æ¯ï¼ç¶åå建äºä¸ä¸ª XMLHttpRequest
æ¥å¤çä¸ä¼ æ°æ®ã
å®é ä¼ è¾æ°æ®åï¼éåäºå éå夿¥éª¤ï¼
XMLHttpRequest
ç progress
çå¬å¨è¢«è®¾ä¸ºå°å è½½æç¤ºå¨æ´æ°ä¸ºæ°çç¾åæ¯ä¿¡æ¯ï¼è¿æ ·éçä¸ä¼ è¿è¡ï¼æç¤ºå¨ä¼æ¾ç¤ºææ°çä¿¡æ¯ãXMLHttpRequest
ç load
çå¬å¨è¢«è®¾ä¸ºå°å è½½æç¤ºå¨çè¿åº¦ä¿¡æ¯æ´æ°ä¸º 100%ï¼ä»¥ä¿è¯è¿åº¦æ¾ç¤ºç¡®å®è¾¾å°äº 100%ï¼ä»¥é²å¨ä¸ä¼ è¿ç¨ä¸åºç°ç²åº¦è¯¯å·®ï¼ãç¶åå®ç§»é¤äºå·²ç»ä¸åéè¦çå è½½æç¤ºå¨ãè¿æ ·ä¸ä¼ ä¸å®ææç¤ºå¨å°±ä¼æ¶å¤±ãXMLHttpRequest
ç open()
彿°åé POST 请æ±å®æçãXMLHttpRequest
ç overrideMimeType()
彿°æ¥è®¾ç½®çãè¿ä¸ªä¾åä¸ï¼æä»¬ä½¿ç¨éç¨ MIME ç±»åãæ¯å¦éè¦è®¾ç½® MIME ç±»ååå³äºä½ çå
·ä½ä½¿ç¨æ
åµãFileReader
对象ç¨äºå°æä»¶è½¬æ¢ä¸ºäºè¿å¶å符串ãXMLHttpRequest
ç send()
彿°æ¥ä¸ä¼ æä»¶å
容ãè¿ä¸ªä¾åæ¼ç¤ºäºå¦ä½å¼æ¥ä¸ä¼ æä»¶ï¼å¨æå¡å¨ç«¯ä½¿ç¨äº PHPï¼å¨å®¢æ·ç«¯ä½¿ç¨äº JavaScriptã
<?php
if (isset($_FILES['myFile'])) {
// 示ä¾ï¼
move_uploaded_file($_FILES['myFile']['tmp_name'], "uploads/" . $_FILES['myFile']['name']);
exit;
}
?><!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>dnd binary upload</title>
<script type="application/javascript">
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 obj_url = URL.createObjectURL(blob);
const iframe = document.getElementById("viewer");
iframe.setAttribute("src", obj_url);
URL.revokeObjectURL(obj_url);
示ä¾ï¼å°å¯¹è±¡ URL ç¨äºå
¶ä»æä»¶ç±»å
ä½ å¯ä»¥ç¨åæ ·æ¹å¼æä½å ¶ä»æ ¼å¼çæä»¶ãè¿æ¯é¢è§ä¸ä¼ çè§é¢çæ¹æ³ï¼
const video = document.getElementById("video");
const obj_url = URL.createObjectURL(blob);
video.src = obj_url;
video.play();
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