抛出问题1:如何实现文件的上传
使用html的input元素可以实现文件的上传
<input
id="sendImage"
title="this is imgUpload"
type="file"
accept="image/* "
onchange="imgChange(this)"
/>
| type="file" | 规定该input仅用于上传文件 |
|---|---|
| accept="image/* " | 规定支持任何图片格式 |
| onchange="imgChange(this)" | 绑定change事件,监听文件的上传 |
抛出问题2:页面如何展示图片
- 使用blob
- 使用base64
1.首先监听上传的图片
FileList对象来自于HTML的files属性,可以通过e.files访问,当上传图片时会触发onchange事件,通过e.files拿到当前上传图片的信息
function imgChange(e) {
console.log(e.files);
}
2.处理图片信息
2.1 使用FileReader对象读取文件
const fileReader = new FileReader();
fileReader.readAsDataURL(e.files[0]);
fileReader.addEventListener("load", function () {
let res = fileReader.result;
document.querySelector("#img_base_64_show").src = res;
console.log(res);
});
监听filereader的load事件,通过filereader.result可以获取图片的base64格式,可以用于页面的图片展示
2.2 使用blobUrl来展示
let file = e.files[0];
var blob = new Blob([file], { type: file.type });
var url = URL.createObjectURL(blob);
console.log(blob, url);
document.querySelector("#img_show").src = url;
Blob URL 是通过将 Blob 对象生成一个 URL 来实现展示二进制文件的方式。
Base64 和 Blob URL 展示图片的优缺点
Base64
Base64 是一种将二进制数据编码成 ASCII 字符串的方法。前端中通常使用 Base64 来解决图片、音频等二进制文件无法直接传输的问题。下面是 Base64 的优缺点:
优点:
- 方便传输:Base64 可以通过 HTTP 协议直接传输,无需额外的请求。
- 简化操作:使用 Base64 可以避免一些繁琐的操作,如在服务器端对图片进行处理,通过代码上传至 CDN 等步骤。
- 减轻服务器压力:使用 Base64 可以减轻服务器端的压力,因为传输的是字符串,可以避免频繁读写硬盘。
缺点:
- 增加体积:Base64 编码会使二进制数据的体积增大约三分之一左右,因此会占用更多网络带宽和浏览器内存。
- 降低加载速度:相比于直接加载本地或远程图片,Base64 编码的图片需要客户端将其转换成二进制数据,并解码成图片,所以会降低页面的加载速度。
- 不便于缓存: 因为 Base64 图片是内嵌在 HTML 或 CSS 中的,无法像普通图片那样被浏览器缓存。
Blob URL
Blob URL 是通过将 Blob 对象生成一个 URL 来实现展示二进制文件的方式。下面是 Blob URL 的优缺点:
优点:
- 较小体积:相比于 Base64 编码的字符串,Blob URL 只有一个字符串地址,因此在大小上会更加小巧。
- 快速加载:由于只需要加载一条 URL 地址,而不需要额外进行转换操作,因此大大提高了页面的加载速度。
- 可被浏览器缓存:与常规的图片 Url 相同,Blob URL 的图片可以被客户端浏览器本地缓存,提高用户访问速度。
缺点:
- 不便传输:Blob URL 生成的 URL 只能在浏览器中使用,无法直接传输给服务器端。
- 获取困难:获取 Blob 对象并不像获取 Base64 数据那样方便,需要通过 XMLHttpRequest、FileReader 等对象才能得到 Blob 对象。
- 兼容性问题:Blob URL 在 IE10 及以下版本浏览器不支持,在移动端 iOS 系统上也有兼容性问题。
总的来说,Base64 和 Blob URL 都有各自的优点和缺点,我们在实际开发中需要根据实际情况选择使用哪种方式。如果你需要传输文件到服务器端、需要跨域访问则可以使用 Base64 编码;如果要保证加载速度、可被浏览器缓存,那么建议使用 Blob URL 的方式展示图片。
总结
1.前端展示的话可以使用BlobUrl来做,后端存储的话,可以将base64存放在后端,如Minio中。在拿到数据后,前端转化为BlobUrl进行展示。
2.通过input元素可以实现图片的上传,在一些组件库中,可以隐藏input框,来美化图片上传控件。
3.同样的,上述图片的展示也可以用于pdf的展示,使用HTML<embed>元素将外部内容嵌入文档中的指定位置。