【保存视频】保存到相册失败,完整错误信息: {errMsg: "saveVideoToPhotosAlbum:fail invalid video"}
代码saveVideo(videoUrl) {
// 打印1:原始视频URL(确认传入地址无误)
console.log('【保存视频】尝试保存的视频URL:', videoUrl);
// 1. 校验URL是否为合法网络地址
if (!/^https?:\/\/.+/.test(videoUrl)) {
uni.showToast({
title: '视频地址无效,仅支持网络HTTPS地址',
icon: 'none'
});
console.error('【保存视频】URL校验失败:非合法HTTPS网络地址');
return;
}
// 3. 申请相册写入授权
uni.authorize({
scope: 'scope.writePhotosAlbum',
success: () => {
uni.showLoading({
title: '正在下载视频',
mask: true
}); // 加mask防止误操作
console.log('【保存视频】相册授权成功,开始下载视频文件');
// 4. 下载视频文件
uni.downloadFile({
url: videoUrl,
timeout: 30000, // 增加超时时间(30秒),适配大文件
success: (downloadRes) => {
uni.hideLoading();
// 打印2:下载完整结果(状态码、临时路径、响应头)—— 核心定位跨域/文件类型问题
console.log('【保存视频】下载文件成功,结果:', downloadRes);
// 5. 校验下载结果:状态码200 + 临时文件路径存在 + 路径含视频后缀
const isValid = downloadRes.statusCode === 200 &&
downloadRes.tempFilePath &&
/.(mp4|mov|avi)$/i.test(downloadRes.tempFilePath);
if (isValid) {
uni.showLoading({
title: '正在保存到相册',
mask: true
});
console.log('【保存视频】下载文件校验通过,开始保存到相册,临时路径:', downloadRes
.tempFilePath);
// 6. 保存视频到相册
uni.saveVideoToPhotosAlbum({
filePath: downloadRes.tempFilePath,
success: () => {
uni.hideLoading();
uni.showToast({
title: '视频保存成功',
icon: 'success',
duration: 2000
});
console.log('【保存视频】视频成功保存到手机相册');
},
fail: (err) => {
uni.hideLoading();
// 打印3:保存相册失败详情(完整err对象,含错误码/错误信息)
console.error('【保存视频】保存到相册失败,完整错误信息:',
err);
// 特殊报错处理:授权拒绝/文件无效/系统不支持
if (err.errMsg.includes('auth deny')) {
uni.showModal({
title: '授权失败',
content: '需要开启「保存到相册」权限才能继续',
confirmText: '去开启',
success: (res) => {
if (res.confirm)
uni
.openSetting(); // 打开小程序权限设置页
}
});
} else if (err.errMsg.includes(
'invalid video')) {
uni.showToast({
title: '保存失败:视频文件无效/编码不兼容',
icon: 'none',
duration: 3000
});
} else {
uni.showToast({
title: '保存失败:' + err
.errMsg,
icon: 'none'
});
}
}
});
} else {
// 打印4:下载文件校验失败详情(定位哪条校验不通过)
console.error('【保存视频】下载文件校验失败,校验项结果:', {
statusCodeIs200: downloadRes.statusCode === 200,
hasTempFilePath: !!downloadRes.tempFilePath,
hasVideoSuffix: /\.(mp4|mov|avi)$/i.test(
downloadRes.tempFilePath || '')
});
uni.showToast({
title: '视频下载失败,可能是域名未配置/跨域问题',
icon: 'none',
duration: 3000
});
}
},
fail: (err) => {
uni.hideLoading();
// 打印4:下载网络失败详情
console.error('【保存视频】视频下载网络失败,完整错误:', err);
uni.showToast({
title: '网络错误,下载失败',
icon: 'none'
});
}
});
},
fail: (err) => {
// 打印:授权失败详情
console.error('【保存视频】相册授权失败,错误信息:', err);
// 授权失败,引导用户手动开启
uni.showModal({
title: '需要授权',
content: '保存视频需要「访问相册」权限,是否去开启?',
confirmText: '去开启',
cancelText: '取消',
success: (res) => {
if (res.confirm) uni.openSetting(); // 打开小程序权限设置页面
}
});
}
});
},
3 个回复
Ask小助手
根据知识库内容,uni.saveVideoToPhotosAlbum 在 iOS 微信小程序 平台下确实存在兼容性限制,且你遇到的错误
saveVideoToPhotosAlbum:fail invalid video是平台行为差异导致的常见问题。✅ 问题定位依据(来自知识库):
✅ 解决方案(基于知识库建议):
✅ 1. 确保视频格式为 iOS 支持的编码
✅ 2. 使用
uni.chooseMedia替代uni.downloadFileuni.chooseMedia会返回系统已验证的临时路径,避免格式不兼容问题。✅ 3. 检查视频文件是否完整下载
uni.downloadFile成功后,务必确认tempFilePath文件存在且可播放。uni.getVideoInfo验证视频是否有效:⚠️ 注意事项(来自知识库):
微信小程序隐私协议配置指南
downloadFile或chooseMedia获取本地路径。✅ 总结
你当前的问题是由于 iOS 微信小程序对视频格式和来源的严格限制 导致的。建议:
uni.chooseMedia获取视频(兼容性更好);uni.getVideoInfo验证文件有效性。如需进一步调试,可上传一个符合上述条件的测试视频,确认是否为格式问题。
高祥栋 (作者) - 111
测试视频https://yundongnet.oss-cn-hangzhou.aliyuncs.com/addorder/2026-03-05/202603052139103c5e47714.mp4
DCloud_UNI_yuhe
你好, 你说的 ios小程序 是哪家的小程序
高祥栋 (作者)
微信小程序
2026-03-06 17:23
要回复问题请先登录或注册
公告
更多>相关问题