如何使用Expo Filesystem将视频转base64并上传到Cloudinary
代码问题修复方案
你代码中存在3个核心错误:
- 未给异步方法
FileSystem.readAsStringAsync添加await关键字,直接拼接会拿到Promise对象而非base64结果 - 方法参数语法错误,uri和配置对象之间缺少逗号分隔
- fetch提交POST请求时直接传入普通对象作为body,未按Cloudinary要求使用FormData格式,且未设置对应请求头
修复后可运行代码
let pickerResult = await ImagePicker.launchImageLibraryAsync({ allowsEditing: true, aspect: [4, 3], mediaTypes: ImagePicker.MediaTypeOptions.Videos, }); if (pickerResult.cancelled === true) { return; } // 新增await关键字,修正参数分隔语法 const videoBase64 = await FileSystem.readAsStringAsync(pickerResult.uri, {encoding: 'base64'}); const base64Url = `data:video/mp4;base64,${videoBase64}`; // 用FormData封装上传参数 let formData = new FormData(); formData.append("file", base64Url); formData.append("upload_preset", "******"); const r = await fetch(CLOUDINARY_URL, { body: formData, method: 'POST', headers: { 'Content-Type': 'multipart/form-data', }, }) const datal = await r.json() setVideo(datal.secure_url);
额外优化提示
- 视频文件通常体积较大,转base64会额外增加33%左右的体积,建议直接上传二进制流而非base64格式,可大幅提升上传速度
- ImagePicker的
base64参数仅对图片资源生效,选择视频时无需配置该参数
内容的提问来源于stack exchange,提问作者zeke1
相关产品推荐
相关产品推荐

