赞
踩
最近遇到了一个上传文件的问题,发送请求的时候控制台显示错误 net:ERR_UPLOAD_FILE_CHANGED,特此在此记录解决方案。
当我们需要在前端上传文件发送给后端的时候,如果我们在将文件上传后(没有发送ajax前),改变了本地文件的内容,那么这个请求将无法发送到后端。更详细的步骤如下:
关于这个问题,查了很久,发现有两种解释:
不管是哪种原因,事实证明当我们改了文件内容后,我们确实无法使用这个文件。
- const fileToBase64 = (file,callback) =>{
- const reader = new FileReader();
- reader.readAsDataURL(file);
- reader.onload = (e)=>{
- callback(e.target.result);
- }
- }
- const dataURLToFile => (dataurl, filename) {
- const arr = dataurl.split(',')
- const bstr = window.atob(arr[1])
- let n = bstr.length
- const u8arr = new Uint8Array(n)
- while (n--) {
- u8arr[n] = bstr.charCodeAt(n)
- }
- // 由于我上传的是excel,因为这里type是excel的type
- return new File([u8arr], filename, {
- type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
- })
- }
一个比较果断的做法就是在上传文件的时候,直接将文件进行转换后存储到变量里,以下代码为React + antd 代码示例
- const uploadFile = useRef();
-
- // 文件上传的监听函数
- const handleFileChange = (e)=>{
- // 先将 file 转为 base64
- fileToBase64(e.file,(dataUrl)=>{
- // 再将 base64 转回 file
- const cacheFile = dataURLToFile(dataUrl,e.file.name);
-
- // 此时文件已经存储到内存中,与本地文件脱离了关系,不会再受影响
- uploadFile.current = cacheFile
- })
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。