Base64 转 File
1. Base64转Blob
function base64ToBlob (datastr) {
let arr = datastr.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new Blob([u8arr], {type: mime})
}
2. Blob转File
function blobToFile(blob) {
blob.lastModified = Date.now()
blob.lastModifiedDate = new Date()
return blob
}
3. 利用new FormData() 给文件命名
let formdata = new FormData()
formdata.append('file', blob, '自定义文件.后缀')
💡TIP
- 由于浏览器兼容问题,没有使用
new File()
- 尽管给 blob 对象添加修改时间和命名,但是最后得到的文件并不是真正意义上的
file
, 传递至后台,后台接收到的文件名会是'blob'
,而不是我们自定义的name
,可利用new FormData()
的第三个参数解决
文件校验
校验类型
function fileTypeCheck (file, accept = []) {
return new Promise((resolve, reject) => {
let name = file.name,
type = name.slice(name.lastIndexOf('.')) || 'unknown';
if (accept.includes(type)) {
resolve(true)
} else {
reject(false)
}
})
}
校验大小
function fileSizeCheck(file, limit = 10) {
return new Promise((resolve, reject) => {
const { size } = file
if (Number(size / (1024 * 1024).toFixed(2)) > limit) {
reject(false)
} else {
resolve(true)
}
})
}
上传文件 Network Error
用户上传文件至浏览器,然后在本地修改或删除该文件,后续没有重新上传而是使用浏览器保存的那份旧文件,上传会失败;此时捕获到的 axios 的错误提示 Network Error,然后在浏览器控制台可以看到接口的错误信息中提示:ERR_UPLOAD_FILE_CHANGE 或者 ERR_FILE_NOT_FOUND;
由于我在 axios 的响应拦截器中设置了若捕获到 Network Error,会提示 网络错误 ,这样的提示对用户不太友好;通过查询资料可以发现,前端其实可以判断文件是否被删除或修改的,这样,若用户无意中触发了上述操作,我们就能在上传之前给出对应提示;
function isFileModifyOrDelete(file) {
return new Promise((resolve, reject) => {
const ERROR_DICT = {
'NotFoundError': '找不到本地源文件',
'NotReadableError': '本地源文件已修改',
'SecurityError': '操作安全错误'
}
const reader = new FileReader()
reader.readAsArrayBuffer(file)
reader.onload = function () {
return resolve(true)
}
reader.onerror = function (e) {
let error = e.target.error
return reject(ERROR_DICT[error.name])
}
})
}
参考:
文件切片、断点续传
⏰