如何用Apex向Google Drive上传文件并指定文件名、发送元数据
问题根因
你当前使用的uploadType=media参数仅支持上传二进制文件内容本身,不支持携带自定义元数据,因此Google Drive会默认将文件命名为Untitled,无法同步你期望的文件名、目录归属等配置。
解决方法
要同时上传文件内容和元数据(含文件名),需要改用multipart类型上传,按照以下逻辑修改代码即可:
核心修改点
- 将Endpoint的
uploadType参数从media改为multipart - 构造multipart格式请求体,分为两个部分:
- 第一部分为JSON格式的元数据,可指定
name(文件名)、parents(父目录ID)、description(文件描述)等属性 - 第二部分为二进制文件内容
- 第一部分为JSON格式的元数据,可指定
- 修正原代码中重复发送请求、超时参数设置位置错误的问题
修改后的完整代码
String access_token = '你的授权token'; String base64 = '你的文件base64编码'; String fileName = '自定义文件名.jpg'; // 你要设置的文件名 String boundary = '----GoogleDriveBoundary' + String.valueOf(Crypto.getRandomLong()); // 随机边界值,避免和内容冲突 // 构造元数据部分 String metaPart = '--' + boundary + '\r\n' + 'Content-Type: application/json; charset=UTF-8\r\n\r\n' + JSON.serialize(new Map<String, Object>{ 'name' => fileName, // 可选:指定上传到指定文件夹,替换为你的文件夹ID即可 // 'parents' => new List<String>{'xxx文件夹ID'}, // 可选:添加文件描述 // 'description' => '这是上传的图片文件' }) + '\r\n'; // 构造文件内容部分 String filePart = '--' + boundary + '\r\n' + 'Content-Type: image/jpeg\r\n\r\n'; String endPart = '\r\n--' + boundary + '--'; // 拼接完整请求体 Blob bodyBlob = Blob.valueOf(metaPart + filePart); bodyBlob = Blob.join(new List<Blob>{bodyBlob, EncodingUtil.base64Decode(base64), Blob.valueOf(endPart)}, Blob.valueOf('')); // 构造请求 HttpRequest req1 = new HttpRequest(); req1.setMethod('POST'); req1.setEndpoint('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart'); req1.setHeader('Authorization', 'Bearer ' + access_token); req1.setHeader('Content-Type', 'multipart/related; boundary=' + boundary); req1.setHeader('Content-Length', String.valueOf(bodyBlob.size())); req1.setBodyAsBlob(bodyBlob); req1.setTimeout(60 * 1000); // 超时必须在发送请求前设置 // 发送请求 Http http = new Http(); HttpResponse res = http.send(req1); // 打印返回结果 System.debug('状态码:' + res.getStatusCode()); System.debug('返回内容:' + res.getBody());
元数据扩展说明
你可以在元数据的JSON结构中添加任意Google Drive支持的文件属性,常用属性如下:
name:文件名,必填项parents:数组类型,值为目标文件夹的ID,可指定文件上传到指定目录description:字符串类型,文件描述mimeType:可自定义文件的MIME类型,比如需要将csv文件转为Google Sheets格式时可指定为application/vnd.google-apps.spreadsheet
内容的提问来源于stack exchange,提问作者Nishant Chauhan
相关产品推荐
相关产品推荐

