Javascript 当我下载一个上传到Google Drive的文件时,我得到的文件大小与原始文件不同

Javascript 当我下载一个上传到Google Drive的文件时,我得到的文件大小与原始文件不同,javascript,react-native,google-drive-api,Javascript,React Native,Google Drive Api,大家好 我的目标是将存储在设备存储器中的数据库(RealmJS)通过Google Drive API V3上传到Google Drive,为此,我已经安装了一些节点模块,如react native fs,以及@react native community/Google sign 数据库上载过程进行得很顺利,但我不知道实际应该使用什么方法上载文件,我到处都找过了,发现有一种方法缓冲区,新Blob(),和新FormData() 我已经尝试过这三种方法,其中两种是Buffer和new Blob()生成

大家好

我的目标是将存储在设备存储器中的数据库(
RealmJS
)通过
Google Drive API V3
上传到Google Drive,为此,我已经安装了一些节点模块,如
react native fs
,以及
@react native community/Google sign

数据库上载过程进行得很顺利,但我不知道实际应该使用什么方法上载文件,我到处都找过了,发现有一种方法
缓冲区
新Blob()
,和
新FormData()

我已经尝试过这三种方法,其中两种是
Buffer
new Blob()
生成与原始文件不同的文件大小,而
new FormData()
方法的结果只会导致网络错误,即使我的网络状况良好

我对
googledriveapi V3
还是一个新手,我不知道如何解决这个问题,即使我读了文档,我也看不懂,因为我的英语不好。如果您对这个问题有一个想法,并对您发布的代码进行解释,这将对我和其他读者都有帮助

这是我的代码

从“react native fs”导入fs;
从'@react native community/google-signin'导入{GoogleSignin};
/**
*在这里,我已经登录到我自己的谷歌帐户,所以我只需要采取令牌
*/
异步函数backupdatebase(){
const{accessToken}=wait GoogleSignin.getTokens();
const noneMime='application/octet stream';
/**
*使用“uploadType=resumable”,因为我的文件大小大于5MB
*/
const requestUpload=等待获取(
'https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable',
{
方法:“POST”,
标题:{
授权:`Bearer${accessToken}`,
“内容类型”:“应用程序/json;字符集=UTF-8”,
“X-Upload-Content-Type”:非MIME,
},
正文:JSON.stringify({
名称:“mydb.realm”,
mimeType:noneMime,
描述:'备份数据库',
父项:['appDataFolder'],
}),
},
);
if(requestUpload.ok){
const resumableUploadURL=requestUpload.headers.get('location');
/**
*我读了文件,它是“.realm”ext-soo
*“base64”编码
*/
const myFile=wait fs.readFile(myPathFile,'base64');
/**
*这就是我用这种方法上传文件的方式
*/
constfileblob=newblob([myFile],{type:noneMime});
constfilebuffer=Buffer.from(myFile'base64');
/**
*这一个总是失败的网络甚至失败
*我的网络很好
*/
const fileFormData=new FormData();
追加('file',fileBlob);
const uploadDatabase=等待获取(resumableUploadURL{
方法:'放',
标题:{
授权:`Bearer${accessToken}`,
“内容类型”:“应用程序/八位字节流”,
“X-Upload-Content-Type”:“应用程序/八位字节流”,
},
/**
*在这个阶段,我不明白该用什么方法?
*你们知道吗?那是“缓冲区”、“Blob”还是“FormData”?
*/
正文:fileBlob、//或“fileBuffer”或“fileFormData”
});
const responseUpload=wait uploadbase.json();
console.log(responseUpload);
}
}

在本期中,我在使用
API
时出错,错误在于我没有将query
alt=media
传递到URL中,它应该是
”https://www.googleapis.com/drive/v3/files/“+fileId+”?alt=media“

在上面的代码中,我使用
fileBuffer
而不是
fileBlob
fileFromData
作为
请求主体
,就是这样,我上传的
领域
完全正常,我可以正常打开它


感谢您对我的帮助:D

确实没有进入react,但您正在将文件作为base64字符串读取,因此当您执行
新建Blob([myFile])
时,您真正要做的是从这个用utf-8编码的base64字符串创建一个新的文本文件:这根本不是您的原始文件。不确定这个
Blob
实现接受什么作为输入,但是您需要直接从缓冲区构建一个(不要将编码选项传递给
readFile
)@kaido感谢您的回答:),但如果我没有通过编码,它将抛出一个错误,因为
react native fs
中的
readFile
具有默认编码,即
utf-8
,因此我无法读取
utf-8
中的文件
领域
,并且您不能让它返回缓冲区?再一次,我完全不知道如何反应,但这是
readFile
的默认值,如果他们删除了它,就会把事情搞得一团糟。@kaido不,它没有返回缓冲区,不像nodej中的
fs
那么你的
fileBuffer
保存着什么?将base64字符串解析为缓冲区的结果?如果是这样的话,试着用它来构建Blob。虽然对我来说,编码+解码听起来很傻。。。