替换ResumableUploadForGoogleDrive2时提示缺少必填参数,但代码已传入对应参数的问题求助
替换ResumableUploadForGoogleDrive2时提示缺少必填参数,但代码已传入对应参数的问题求助
嗨,我仔细看了你的问题和代码,马上就找到问题所在啦——ResumableUploadForGoogleDrive2(v2)的参数要求和v1版本完全不一样,你现在传的参数结构不符合v2的预期,才会触发这个报错。
问题核心:v1和v2的参数结构差异
先看v2源码里的初始化判断逻辑:
if (!("accessToken" in resource) || !("file" in resource)) { reject({ Error: "There are no required parameters. accessToken, fileName, fileSize, fileType and fileBuffer are required.", }); return; }
这里有个小文案bug:错误提示还停留在v1的参数要求,但实际代码判断的是resource里必须包含accessToken和原始的File对象,而不是你现在传的fileBuffer、fileName这些拆分属性。
你的代码里传给v2的resource只包含了拆分后的文件属性,但没有传入原始的File对象,所以v2直接判定缺少必填参数,抛出了错误。而且v2的设计初衷就是避免把整个文件加载到内存,它会自己处理文件的切片和读取,根本不需要你提前用FileReader把整个文件读成ArrayBuffer(这也是它解决v1内存溢出问题的关键)。
修复方案:调整参数结构,使用原始File对象
你只需要修改upload函数的代码,去掉不必要的FileReader逻辑,直接把原始的File对象传给v2的resource即可:
修改后的upload函数:
function upload({ accessToken, file, idx, newFolderId }) { return new Promise((resolve, reject) => { var id = `p_${idx}`; var div = document.createElement("div"); div.id = id; document.getElementById("progress").appendChild(div); document.getElementById(id).innerHTML = "Initializing."; // 注意:v2需要的是原始File对象,不是拆分的属性 const resource = { file: file, // 直接传入循环拿到的原始File对象 accessToken: accessToken, folderId: newFolderId, // 可选:如果需要自定义分片大小,可以加上这个参数(默认是50MB) // chunkSize: 52428800 }; const ru = new ResumableUploadToGoogleDrive(); ru.Do(resource, function (res, err) { if (err) { reject(err); return; } console.log(res); let msg = ""; if (res.status == "Uploading") { msg = Math.round((res.progressNumber.current / res.progressNumber.end) * 100) + `% (${file.name})`; } else { msg = `${res.status} (${file.name})`; } if (res.status == "Done") { resolve(res.result); } document.getElementById(id).innerText = msg; }); }); }
为什么这样改能解决问题?
- v2的初始化逻辑会检测到
resource里的accessToken和file参数,不会再抛出缺少必填项的错误 - v2内部会自动从
file对象中获取文件名、大小、类型等信息,不需要你手动拆分 - v2会按切片读取文件内容,不会把整个大文件加载到内存里,完美解决你之前遇到的内存溢出问题
这样修改后,应该就能正常使用v2版本的上传功能啦,同时也能处理大量大文件的上传需求~
备注:内容来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

