Google Drive REST API无法上传文件到指定文件夹问题
Google Drive v3 API 上传文件指定父文件夹失效解决方案
核心问题原因
parents参数未生效、文件默认上传到根目录且无报错,90%以上是以下几个高频问题导致:
- 请求未正确携带
uploadType=multipart参数,或参数值写错为media,此时API会直接忽略所有元数据字段,仅接收文件内容存入根目录,不会抛出任何参数错误 - multipart请求中元数据部分的
Content-Type未设置为application/json; charset=UTF-8,导致元数据未被API解析 - 误用v2版本API的参数格式,或在新建文件接口错误使用仅移动文件时生效的
addParents参数 - 应用对目标文件夹无写入权限,API会静默回退存储到根目录,无权限报错
正确参数格式
Drive v3 版本上传新建文件时,parents字段直接传入字符串数组即可,不需要嵌套id对象,正确的元数据JSON结构如下:
{ "name": "目标文件名", "parents": ["替换为你的目标文件夹ID"] }
注意:嵌套
{"id": "文件夹ID"}对象的写法是Drive v2版本的规范,v3版本下该写法会被直接忽略。addParents参数仅在移动已有文件的更新接口生效,新建上传时使用无效。
正确实现要求
- 基础请求配置校验
- 请求方法为
POST - 请求地址为上传专用端点,必须携带
uploadType=multipart参数 - 请求头携带有效的OAuth2授权令牌,授权Scope需包含Drive写入权限
- 请求方法为
- multipart请求体结构校验
严格按照两部分构造请求体,边界符配置正确:- 第一部分为元数据:必须设置头
Content-Type: application/json; charset=UTF-8,内容为构造好的元数据JSON字符串 - 第二部分为文件内容:设置头为对应文件的MIME类型,内容为本地文件的二进制流
- 第一部分为元数据:必须设置头
- 前置条件校验
- 传入的文件夹ID为正确的唯一标识字符串,不是文件夹名称或访问路径
- 授权账号对目标文件夹拥有编辑写入权限,若使用
drive.file级别的授权Scope,仅能向应用自身创建的文件夹上传文件
Android端OkHttp实现参考代码
// 替换为实际业务参数 String accessToken = "你的OAuth2访问令牌"; String parentFolderId = "目标文件夹ID"; File uploadFile = new File("本地文件绝对路径"); String fileMimeType = getMimeType(uploadFile); // 自行实现文件MIME类型获取逻辑 // 构造元数据,直接使用字符串数组传parents即可 JSONObject metadata = new JSONObject(); try { metadata.put("name", uploadFile.getName()); metadata.put("parents", new String[]{parentFolderId}); } catch (JSONException e) { e.printStackTrace(); } // 构造multipart请求体 String boundary = "----DriveUpload" + System.currentTimeMillis(); OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new MultipartBody.Builder(boundary) .addPart( Headers.of("Content-Type", "application/json; charset=UTF-8"), RequestBody.create(metadata.toString().getBytes(StandardCharsets.UTF_8), MediaType.parse("application/json; charset=UTF-8")) ) .addPart( Headers.of("Content-Type", fileMimeType), RequestBody.create(uploadFile, MediaType.parse(fileMimeType)) ) .build(); Request request = new Request.Builder() .url("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart") .addHeader("Authorization", "Bearer " + accessToken) .post(requestBody) .build(); // 执行上传请求 try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { String resStr = response.body().string(); JSONObject resJson = new JSONObject(resStr); String uploadedFileId = resJson.getString("id"); // 上传成功逻辑 } } catch (IOException | JSONException e) { e.printStackTrace(); }
之前尝试的写法问题说明
- 字符串数组传参:写法本身完全符合v3 API规范,失效原因是请求其他配置不符合要求(优先检查uploadType参数和元数据Content-Type头)
- JSONArray嵌套id对象传参:属于v2版本API写法,v3版本不识别
- ArrayList集合传参:若JSON序列化逻辑正常,效果和字符串数组一致,本身无问题,失效原因同第一种
- addParents参数:使用场景错误,新建文件时不生效
内容的提问来源于stack exchange,提问作者Mahesh Ambekar
相关产品推荐
相关产品推荐

