使用Zoom下载URL上传录音至Salesforce ContentVersion时文件损坏求助
解决Zoom录音上传Salesforce ContentVersion后文件损坏的问题
问题核心是你用axios下载Zoom音频文件时,默认把响应解析成了UTF-16字符串,二进制数据被转码破坏,导致上传到Salesforce后文件损坏无法播放。
修改后的代码
// Get download_url field from Zoom file returned by api const downloadFileUrl = audioFile.download_url; const token = await generateToken(); // 关键修改:添加responseType: 'arraybuffer',获取原始二进制数据 const recordingResponse = await axios.get(`${downloadFileUrl}?access_token=${token.access_token}`, { responseType: 'arraybuffer' }); // Generate form data const formData = new FormData(); const metadata = { Title: audioFile.id, // 修正原代码变量混淆问题,应该用audioFile的id ContentLocation: 's', PathOnClient: 'audio.m4a', OwnerId: ownerId ?? process.env.DEFAULT_FILE_OWNER_ID, ReasonForChange: 'Testing', }; formData.append('entity_content', JSON.stringify(metadata), { contentType: 'application/json' }); const file = recordingResponse.data; // 现在data是ArrayBuffer类型的原始二进制数据 formData.append('VersionData', file, { filename: metadata.PathOnClient, contentType: 'audio/m4a' // 替换通用类型为具体音频MIME类型,帮助Salesforce识别 }); const conn = await salesforceClient.getClient(); const axiosConfig = { headers: { 'Authorization': `Bearer ${conn.accessToken}`, // 移除手动设置的Content-type,FormData会自动生成带boundary的正确请求头 } }; // Post to Salesforce await axios.post(`${process.env.SALESFORCE_LOGIN_URL}/services/data/v55.0/sobjects/ContentVersion`, formData, axiosConfig) .catch((error) => console.log(error));
关键修改说明
- 指定responseType为arraybuffer:axios默认会把响应解析为字符串,对于音频这类二进制文件,必须显式设置该参数,才能拿到未被修改的原始二进制数据。
- 修正变量名:原代码里的
file.id属于变量混淆,应该使用audioFile.id避免错误。 - 替换MIME类型:用
audio/m4a替代application/octet-stream,让Salesforce更准确识别文件类型,避免后续播放异常。 - 移除手动Content-type设置:使用FormData时,axios会自动生成包含boundary的
multipart/form-data请求头,手动设置反而可能导致格式错误。
内容的提问来源于stack exchange,提问作者letie
相关产品推荐
相关产品推荐

