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 } = fileif (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.errorreturn reject(ERROR_DICT[error.name])}})}
参考:
文件切片、断点续传
⏰
