如何将音频Blob文件上传至AWS S3存储桶?上传后文件为空求解
问题分析与解决方法
你的核心问题是误用了URL.createObjectURL()的返回值——它生成的是指向内存中Blob的URL字符串,不是实际的二进制音频数据。你把这个字符串塞进File构造函数,相当于上传了一段文本(就是那个blob:http://...的字符串),而不是真正的音频文件,所以S3里的文件是空的。
正确的处理方式
直接使用请求返回的原始二进制数据(response.data),不需要通过URL.createObjectURL()转成URL。前提是你发起请求时要确保返回的是Blob/ArrayBuffer类型,比如用axios的话要设置responseType: 'blob'。
修正后的代码示例
// 假设你的请求已经正确获取到Blob格式的音频数据(比如axios设置了responseType: 'blob') const audioBlob = response.data; // 直接将Blob作为Body上传,S3支持直接接收Blob类型 const command = new PutObjectCommand({ Body: audioBlob, Bucket: BUCKET_NAME, Key: "filename2.mpeg", ContentType: "audio/mpeg" // 显式设置文件类型,避免S3自动识别错误 }); const newResponse = await client.send(command);
如果需要转成File的写法
const audioBlob = response.data; const file = new File([audioBlob], 'filename2.mpeg', { type: 'audio/mpeg', lastModified: Date.now() }); const command = new PutObjectCommand({ Body: file, Bucket: BUCKET_NAME, Key: "filename2.mpeg", ContentType: "audio/mpeg" }); const newResponse = await client.send(command);
额外注意事项
- 确认请求返回的是Blob:比如axios请求时添加
responseType: 'blob'配置,fetch则用response.blob()转换响应体。 - 显式设置
ContentType能让S3正确识别文件类型,避免后续下载或预览时出现格式问题。
内容的提问来源于stack exchange,提问作者Jojo Momo
相关产品推荐
相关产品推荐

