使用expo-app-auth上传文件至Google Drive指定文件夹失败
问题分析与解决
你遇到的核心问题是使用FormData处理multipart/related类型的请求不符合Google Drive API的要求,导致metadata里的parents参数没有被正确解析,文件默认上传到根目录。
FormData生成的是multipart/form-data格式的请求体,而Drive API的multipart上传要求的是multipart/related格式——这种格式需要明确的分隔符,且每个部分需要指定Content-Type和必要标识,FormData无法满足这些自定义要求。
修复方案
替换FormData的使用,手动构造符合multipart/related格式的请求体:
const uploadFile = async (file) => { if (file) { const filename = file.name; const folderId = "1Qu1IIsQJjAE131w97tLVM5FlTtExEQ1K"; // 目标文件夹ID const metadata = { name: filename, parents: [folderId], mimeType: file.mimeType, supportsAllDrives: true, }; // 生成随机分隔符 const boundary = "-------314159265358979323846"; const delimiter = `\r\n--${boundary}\r\n`; const closeDelimiter = `\r\n--${boundary}--`; // 构造metadata部分 const metadataBlob = new Blob( [JSON.stringify(metadata)], { type: "application/json" } ); // 构造完整的请求体 const parts = [ delimiter, `Content-Type: application/json\r\n\r\n`, metadataBlob, delimiter, `Content-Type: ${file.mimeType}\r\n\r\n`, file, closeDelimiter ]; const formDataBlob = new Blob(parts); try { const res = await fetch( "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart", { method: "POST", headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": `multipart/related; boundary=${boundary}`, }, body: formDataBlob, } ); const data = await res.text(); console.log(data); } catch (err) { console.log(err); } } else { Alert.alert("Please select a file to upload"); } };
额外检查项
- 确认
accessToken包含正确的权限范围:至少需要https://www.googleapis.com/auth/drive.file(推荐,仅允许访问通过你的应用创建的文件),或者https://www.googleapis.com/auth/drive(全权限)。 - 验证目标文件夹ID是否正确,且当前认证用户对该文件夹有写入权限(如果是共享文件夹,需确认已获得编辑权限)。
内容的提问来源于stack exchange,提问作者midnighttfoxx
相关产品推荐
相关产品推荐

