-
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
浅析前端上传 #152
Comments
上传基本概念File
FormData
Blob对象可以参考我的另一个记录:blob Url那些事儿 |
常见前端上传场景
tips:
|
自家后端上传服务浅析const formData = new FormData(); // 由于服务端编码格式为multipart/form-data,所以需要构造一个FormData对象
const file = new File([blobObj], fileName, { type: blobObj.type }); // 传入blob对象创建一个File实例
formData.append('file', file);// formData实例增加file对象
const options = {
method: 'post',
url: 'https://foo.bar.com/baz',
headers: { 'Content-Type': 'multipart/form-data' }, // 上传相关
data: formData, // 上传相关
};
axios.request(options).then(()=>{}).catch(()=>{}); |
阿里云OSS上传浅析ali-oss是一个Node环境和Browser环境皆可用的对象存储服务package。 import OSS from 'ali-oss';
const token = apiNode.generateOssToken({ type }) // 调用nodejs端接口,根据类型生成某个bucket有效的token
this.client = new OSS(token);
const blobObj = new Blob([u8arr], { type: mime });
this.client
.put(fileName, blobObj) // 这里我们传入的值blob对象,ali-oss仅支持浏览器端的Blob对象
.then((data) => {
if (data && data.name) {
return data.name; // OSS返回的文件名
}
})
.catch(() => {}); 可以再伪代码基础上用document.cookie设置token的有效时长;上传重试等等护航功能。 关键是ali-oss SDK的put方法,它主要用来向bucket添加一个object。
|
七牛云上传浅析qiniu-js是一个基于七牛API开发的前端SDK。 import * as qiniu from 'qiniu-js';
const putExtra = { fname: '', params: {}, mimeType: null };// fname文件原文件名,params自定义变量,mimeType数组,限制文件上传类型
const config = {
useCdnDomain: true, // 表示是否使用 cdn 加速域名
disableStatisticsReport: false, // 是否禁用日志报告,为布尔值,默认为 false
retryCount: 5, // 上传自动重试次数(整体重试次数,而不是某个分片的重试次数);默认 3 次(即上传失败后最多重试两次);目前仅在上传过程中产生 599 内部错误时生效,但是未来很可能会扩展为支持更多的情况
region: qiniu.region.z0, // 选择上传域名区域;当为 null 或 undefined 时,自动分析上传域名区域
};
const token = apiNode.generateOssToken({ type }) // 调用nodejs端接口,根据类型生成某个bucket有效的token
this.observable = qiniu.upload(obj.file, obj.fileName, token, putExtra, config);
this.observable.subscribe({
next: (res) => {
this.emit('progress', Math.ceil(res.total.percent));
},
error: (err) => {
this.clear();
this.emit('error', err, obj.imgName);
},
complete: (res) => {
this.clear();
this.emit('complete', res.hash, obj.imgName);
},
}); 关键是qiniu-js SDK的upload方法,它是上传的核心。
其次就是这个上传成功后的返回的observable对象,在其中可以做一些上传后的处理。 这个方法本身是一个observable对象,有subscribe方法,主要有next和error,complete三个事件。
与自家服务端和ali-oss不同的是,qiniu-js提供了除成功和失败额外的next事件,可以实时监测到上传的进度,用户感知上传进度是起码的用户体验。 |
几种上传服务的对比
|
思考
|
图片,音频,视频等等这几种常见的资源类型,如果需要从前端上传到服务端,有几种方式呢?不妨回顾一下经历过的项目想一想。
项目上也用到很多上传文件的地方,七牛云,阿里云OSS,讯飞web api上传都接触过,所以在这里做一个记录,总结一下前端上传的几种方式。
The text was updated successfully, but these errors were encountered: