使用 google drive api 上传 `.docx` 文件并自动转换为 google docs 时,必须同时设置元数据中的 `mimetype` 为 `application/vnd.google-apps.document`,且 **不能** 将原始文件内容的 mime 类型设为该值——否则会因内容类型不匹配触发 400 错误。
在 Google Drive API 中,application/vnd.google-apps.document 是一个虚拟 MIME 类型,仅用于标识目标资源类型(即“创建一个 Google Docs 文档”),它不能作为实际上传文件流的媒体类型。当你调用 new FileContent(type, filePath) 并传入 application/vnd.google-apps.document 时,API 会尝试将 .docx 二进制内容按 Google Docs 格式解析,从而报错:Invalid MIME type provided for the uploaded content.
✅ 正确做法是:
以下是修复后的完整 Java 示例代码:
Drive service = getDriveService();
// 1. 构建文件元数据,并指定目标类型为 Google Docs
com.google.api.services.drive.model.File fileMetadata = new com.google.api.services.drive.model.File();
fileMetadata.setName("sample");
fileMetadata.setMimeType("application/vnd.google-apps.document"); // ✅ 关键:仅在此处设置
// 2. 使用原始 DOCX 的真实 MIME 类型构造 FileContent
java.io.File filePath = new java.io.File("C:\\Users\\sample.docx");
String docxMimeType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
FileContent mediaContent = new FileContent(docxMimeType, filePath);
// 3. 执行创建(自动转换)
com.google.api.services.drive.model.File file = service.files()
.create(fileMetadata, mediaContent)
.setFields("id, name, mimeType, webViewLink")
.execute();
System.out.println("Google Doc ID: " + file.getId());
System.out.println("View URL: " + file.getWebViewLink());⚠️ 注意事项:
);总结:Google Drive 的“上传并转换”机制依赖元数据 mimeType + 原始内容真实 MIME 类型的组合。混淆二者是此类 400 错误的根本原因。遵循“内容用真类型、目标用虚拟类型”的原则,即可稳定实现 DOCX → Google Docs 自动转换。