都2024年了,不会还有人连 URL.createObjectURL
这个 API 都还没用过吧,还不赶紧学习一下它的语法和应用场景!
一、URL.createObjectURL()
URL.createObjectURL()
方法会根据传入的参数创建一个指向该参数对象的URL
. 这个URL的生命仅存在于它被创建的这个文档里. 新的对象URL指向执行的File对象
或者是Blob对象
.
语法:
objectURL = URL.createObjectURL(blob || file);
参数:
File
对象或者Blob
对象
这里大概说下File
对象和Blob
对象:
File
对象,就是一个文件
,比如我用input type="file"标签来上传文件,那么里面的每个文件都是一个File对象.Blob
对象,就是二进制数据,比如通过new Blob(
创建的对象就是Blob
对象.又比如,在XMLHttpRequest
里,如果指定responseType
为blob
,那么得到的返回值
也是一个blob
对象.
注意点:
每次调用createObjectURL
的时候,一个新的URL
对象就被创建了.即使你已经为同一个文件创建过一个URL
. 如果你不再需要这个对象,要释放它,需要使用URL.revokeObjectURL()
方法. 当页面被关闭,浏览器会自动释放它,但是为了最佳性能和内存使用
,当确保不再用得到它的时候,就应该释放它.
二、URL.revokeObjectURL()
URL.revokeObjectURL()
方法会释放一个通过URL.createObjectURL()
创建的对象URL
. 当你要已经用过了这个对象URL,然后要让浏览器知道这个URL已经不再需要指向对应的文件的时候,就需要调用这个方法.
具体的意思就是说,一个对象URL,使用这个url是可以访问到指定的文件的,但是我可能只需要访问一次,一旦已经访问到了,这个对象URL就不再需要了,就被释放掉,被释放掉以后,这个对象URL就不再指向指定的文件
了.
- 比如一张图片,我创建了一个对象URL,然后通过这个对象URL,我页面里加载了这张图.既然已经被加载,并且不需要再次加载这张图,那我就把这个对象URL释放,然后这个URL就不再指向这张图了.
语法:
window.URL.revokeObjectURL(objectURL);
参数:
objectURL
是一个通过URL.createObjectURL()
方法创建的对象URL.
这两个方法不支持低版本浏览器
.
三、应用场景
图片预览
以前我们想要预览图片,只能是上传图片到后端后,获取到url
然后赋予给img
标签,才能得到回显预览,但是有了URL.createObjectURL
就不需要这么麻烦了,直接可以在前端就能达到预览
的效果~
<body>
<input type="file" id="fileInput">
<img id="preview" src="" alt="Preview">
<script>
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', (event) => {
const file = event.target.files[0];
const fileUrl = URL.createObjectURL(file);
const previewElement = document.getElementById('preview');
previewElement.src = fileUrl;
});
</script>
</body>
结合 Blob
URL.createObjectURL
结合Blob
也可以做很多方便开发的事情~
1、WebWorker
我们知道,想要用 WebWorker
的话,是要先创建一个文件
,然后在里面写代码,然后去与这个文件运行的代码进行通信
,有了URL.createObjectURL
就不需要新建文件了,比如下面这个解决excel耗时过长
的场景,可以看到,我们传给WebWorker
的不是一个真的文件路径,而是一个临时的路径
~
const handleImport = (ev: Event) => {
const file = (ev.target as HTMLInputElement).files![0];
const worker = new Worker(
URL.createObjectURL(
new Blob([
`
importScripts('https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.16.4/xlsx.full.min.js');
onmessage = function(e) {
const fileData = e.data;
const workbook = XLSX.read(fileData, { type: 'array' });
const sheetName = workbook.SheetNames[0];
const sheet = workbook.Sheets[sheetName];
const data = XLSX.utils.sheet_to_json(sheet, { header: 1 });
postMessage(data);
};
`,
]),
),
);
// 使用FileReader读取文件内容
const reader = new FileReader();
reader.onload = function (e: any) {
const data = new Uint8Array(e.target.result);
worker.postMessage(data);
};
// 读取文件
reader.readAsArrayBuffer(file);
// 监听Web Worker返回的消息
worker.onmessage = function (e) {
console.log('解析完成', e.data);
worker.terminate(); // 当任务完成后,终止Web Worker
};
};
2、下载文件
同样也可以应用在下载文件上,下载文件其实就是有一个url赋予到a标签上
,然后点击a标签就能下载
了,我们也可以用URL.createObjectURL
去生成一个临时url
// 创建文件 Blob
const blob = new Blob([/* 文件数据 */], { type: 'application/pdf' });
// 创建下载链接
const downloadUrl = URL.createObjectURL(blob);
const downloadLink = document.createElement('a');
downloadLink.href = downloadUrl;
downloadLink.download = 'document.pdf';
downloadLink.textContent = 'Download PDF';
document.body.appendChild(downloadLink);