-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
blob URL那些事儿 #138
Comments
Blob对象知识点
|
关键API window.URL.createObjectURL()
提醒:尤其第三点,涉及到了内存管理,一定要注意释放内存 疑问
vue的单文件组件共有一个document,这也是它被称为单页应用的原因,因此可以在组件间直接通过blob URL进行通信。 组件发出blob URL<label for="background">上传背景</label>
<input type="file" style="display: none"
id="background" name="background"
accept="image/png, image/jpeg" multiple="false"
@change="backgroundUpload"
>
backgroundUpload(event) {
const fileBlobURL = window.URL.createObjectURL(event.target.files[0]);
this.$emit('background-change', fileBlobURL);
// this.$bus.$emit('background-change', fileBlobURL);
}, 组件接收blob URL<BackgroundUploader @background-change="backgroundChangeHandler"></BackgroundUploader>
// this.$bus.$on("background-change", backgroundChangeHandler);
backgroundChangeHandler(url) {
// some code handle blob url...
},
暂时没有找到方法获取所有的blob URL,但是可以通过sessionStorage和localStorage进行标记,通过key进行更新或者访问。 提醒:如果你的项目会涉及到多个tab间的通信,blob URL在另一个tab中是无效的。可以存储原始数据,使用时再转换为blob URL |
Blob,File对象如何转换为base64字符串本地预览仅仅适用于浏览器预览,当需要持久化存储时,就需要将其上传到云存储上,现在用处比较广泛的是OSS、七牛云等公有云,私有云没接触过,应该是大同小异。 可以将blob url转换为base64吗?不可以。 如何将File,Blob对象转换为base64格式?用到一个神奇的对象:Reader对象 transferBlobFileToBase64(file){
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onloadend = async function() {
const fileBase64 = reader.result;
// 下面的接口是一个接入了七牛sdk的接口,通过base64str接收base64格式数据,返回一个hash
const { hash } = await uploadQiNiu({ base64Str: fileBase64 });
// 根据环境对hash进行拼接,生成一个可访问的url并且存储到持久层(mysql, elastic search, tablestore, whatever)
};
} 若需要上传以后传递到其他方法进行数据组装,可以采用下面的方法: async transferBlobFileToBase64(file) {
return new Promise((resolve) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onloadend = async function() {
const fileBase64 = reader.result;
const { hash } = await uploadQiNiu({ base64Str: fileBase64 });
resolve(`${pageConfig.QINIU_IMG_URL}/${hash}`);
};
});
},
async serverAPIRevoke(file) {
const uploadedFile = await this.transferBlobFileToBase64(file);
// 在这里进行数据的组装并且调用服务端接口持久化存储
} |
如何创建一个可用来测试的Blob对象var newBlob = new Blob(array, options);
// array是个数组:数组元素可以是ArrayBuffer,ArrayBufferView, Blob, USVString 普通的 ‘foo’也可以作为生成Blob对象。 var blob = new Blob(['foo'],{type:'text/plain'})
blob.text().then((data)=>{console.log(data)})// 'foo' 这样就生成一个最简易的blob对象了,可以用来测试一些api。 |
不使用canvas的情况下将image的url转换为blob urlfetch apifetch(url).then(response => response.blob()).then((blob)=>{
const urlCreator = window.URL || window.webkitURL;
const imageUrl = urlCreator.createObjectURL( blob );
const img = new Image();
img.crossOrigin = 'Anonymous'; // CORS
img.src = imageUrl;
}) XHR// Simulate a call to Dropbox or other service that can
// return an image as an ArrayBuffer.
const xhr = new XMLHttpRequest();
// Use JSFiddle logo as a sample image to avoid complicating
// this example with cross-domain issues.
xhr.open( "GET", url, true );
// Ask for the result as an ArrayBuffer.
xhr.responseType = "arraybuffer";
xhr.onload = function( e ) {
// Obtain a blob: URL for the image data.
const arrayBufferView = new Uint8Array( this.response );
const blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } );
const urlCreator = window.URL || window.webkitURL;
const imageUrl = urlCreator.createObjectURL( blob );
const img = new Image();
img.crossOrigin = 'Anonymous'; // CORS
img.src = imageUrl;
};
xhr.send(); 问题源于此帖:https://www.v2ex.com/t/648393#reply3 |
先看一下blob URL长什么样:
http/https协议前加了一个blob:,是不是看起来很神奇,其实它不仅看起来神奇,在前端开发领域用处也十分广泛。
blob对象在前端开发中是非常常见的,下面我将列举几个应用场景:
<input type="file" />
上传文件之后的File对象,最初只想在本地留存,时机合适再上传到服务器blob仅仅是一种数据对象,在上述2个场景中,都需要比较重要的一个API,那就是
window.URL.createObjectURL()
。所以我们在介绍blob对象之余,也会对这个关键的API进行介绍。所以文章主要分为以下几个部分:
<input type="file" />
场景下的blobwindow.URL.createObjectURL()
The text was updated successfully, but these errors were encountered: