写在前面: 因为uniapp不支持H5的录音,所以要靠自己去实现,这里用的是依赖库做实现,调用uni.uploadFile时发现文件后缀丢失的问题,例如我要上传一个文件名为:test.mp3,传到服务器后就变成了test.或者test,反正都把后缀名丢了,这里也去uniapp社区逛了,试下来发现都不行,官方没有提供好的解决方案。
基于这种情况,我就想干脆不用官方提供的API,自己写个上传的方1法不就行了吗?
因为uni本身就提供请求相关的api,所以不想为了一个上传再单独引入axios这样的依赖库,所以决定使用fetch
- 先从简单的开始写一个fetch方法:
function uploadByFetch (body) {
return fetch(`上传Url`, {
method: 'POST',
headers: '跟其它请求一样的请求头',
body
}).then((res) => res.json())
}
接下来别急着去调这个方法,先得搞清楚需要上传的文件在JS中变成了什么类型,
是Buffer?Blob?FormData?还是由Blob.createObjectURL()生成的临时路径?
之所以这么问,是因为我在尝试中发现,并不是每种类型都是可以成功的,接下来说说我的答案:
- 首先我的录音文件的一手类型是Blob,如果你碰巧和我一样,那就照着下面的方式去做即可:
const blob = new Blob()
const file = new window.File(
[blob],
'test.mp3', {
type: 'audio/mpeg'
}
)
const form = new FormData()
form.append('file', file)
最后将这个form传给上面写的fetch方法即可,如果你的文件类型不是mp3,那么可以参考:MDN Basics_of_HTTP/MIME_types