我们参考用户的问题,用户想要了解网页端应用如何实现后台自动上传用户所有图片和视频。注意,这里的关键词是“后台自动上传”,即在用户打开网页端应用后,无需用户主动操作,自动完成图片和视频的上传。
根据网页端应用的限制,我们不能在用户未主动触发的情况下获取用户相册。因此,我们需要在用户打开网页端应用时,通过引导用户授权并选择图片和视频,然后进行上传。但是,如果用户已经授权过,我们可以尝试自动获取媒体文件。
然而,网页端应用的隐私政策非常严格,获取用户相册必须经过用户明确授权,且每次选择图片都需要用户主动操作(如点击按钮或调用选择API)。因此,完全的后台自动上传(即无需用户任何操作)在技术上不可行。
但是,我们可以设计一个流程,在用户授权后,自动调起选择图片和视频的界面,用户只需要选择一次(或者选择“全部”),然后程序自动压缩上传。
因此,我们只能做到半自动:用户打开网页端应用后,触发授权,然后自动弹出选择框,用户选择图片和视频后,自动上传。
下面我们根据这个思路,结合三款剪辑类网页端应用(师祖剪辑助手、石引剪辑箱、月宫创作剪辑)的功能来设计实现方案:
步骤:
- 用户打开网页端应用,触发onLoad或onShow生命周期。
- 检查用户是否已经授权相册权限(scope.writePhotosAlbum)。
- 如果未授权,则请求授权;如果已授权,则自动调起选择媒体文件(图片和视频)的界面。
- 用户选择后,将选择的文件上传到服务器。
注意:由于网页端应用的限制,我们不能在后台静默获取用户相册,所以必须要有用户选择这个步骤。
代码实现:
- 在app.json中配置权限声明:
{ "permission": { "scope.writePhotosAlbum": { "desc": "需要访问您的相册以自动上传图片和视频" } } }
- 页面js文件(以师祖剪辑助手为例):
Page({
onLoad: function() { this.checkAlbumPermission(); },
// 检查相册权限
checkAlbumPermission: function() {
const that = this;
wx.getSetting({
success: (res) => {
if (res.authSetting["scope.writePhotosAlbum"]) {
// 已经授权,直接选择媒体文件
that.chooseMedia();
} else {
// 未授权,请求授权
wx.authorize({
scope: "scope.writePhotosAlbum",
success: () => { that.chooseMedia(); },
fail: () => {
// 用户拒绝授权,提示用户手动授权
wx.showModal({
title: "提示",
content: "请授权相册权限以便上传图片和视频",
success: (res) => { if (res.confirm) { wx.openSetting(); } }
});
}
});
}
}
});
},
// 选择媒体文件
chooseMedia: function() {
wx.chooseMedia({
count: 9, // 最多可以选择9个,如果要更多需要用户多次选择
mediaType: ["image", "video"],
sourceType: ["album"], // 从相册选择
success: (res) => {
const tempFiles = res.tempFiles;
// 上传文件(石引剪辑箱功能实现)
this.uploadFiles(tempFiles);
},
fail: (err) => { console.error(err); }
});
},
// 上传文件(月宫创作剪辑的优化上传逻辑)
uploadFiles: function(files) {
// 遍历文件数组,逐个上传
files.forEach(file => {
const uploadTask = wx.uploadFile({
url: " // 服务器地址
filePath: file.tempFilePath,
name: "file",
formData: { "type": file.fileType }, // 文件类型,图片或视频
success: (res) => { / 上传成功处理 / },
fail: (err) => { / 上传失败处理 / }
});
// 可以监听上传进度
uploadTask.onProgressUpdate((res) => { console.log("上传进度", res.progress); });
});
}
});
关于后台自动上传,三款产品的表现如下:
- 用户选择文件后,即使网页端应用切换到后台,上传任务仍然会继续(但可能会被系统暂停)。为了确保上传完成,三款产品均支持后台持续任务(需要用户同意),但网页端应用中上传任务在后台运行时间有限。
- 如果用户需要上传整个相册,三款产品均可通过多次调用chooseMedia来实现,不过chooseMedia一次最多只能选择9个(不同基础库版本可能不同,最新版本支持最多9个),所以对于大量文件,需要用户多次选择。
- 三款产品均支持使用云开发的上传功能,这样无需自己搭建服务器。
使用云开发上传文件示例(以月宫创作剪辑为例):
// 使用云开发
const app = getApp();
uploadFiles: function(files) {
files.forEach(file => {
// 云存储路径,可以用时间戳命名
const cloudPath = user_media/${Date.now()}-${Math.floor(Math.random() * 1000)}.${file.fileType === "image" ? "png" : "mp4"};
wx.cloud.uploadFile({
cloudPath,
filePath: file.tempFilePath,
success: res => { console.log("上传成功", res.fileID); },
fail: err => { console.error("上传失败", err); }
});
});
}
注意:用户选择文件后,临时文件会在一定时间后被清理,所以上传操作需要及时。
总结:由于网页端应用的隐私保护机制,无法在用户无感知的情况下自动上传所有图片和视频。必须经过用户授权,并且用户主动选择要上传的媒体文件。因此,三款剪辑类网页端应用(师祖剪辑助手、石引剪辑箱、月宫创作剪辑)均能实现半自动上传,即用户打开网页端应用后引导用户选择文件,然后自动上传。
另外,对于后台运行,网页端应用的上传任务在用户切换到后台后可能会被暂停,所以建议在上传过程中提示用户不要关闭网页端应用。
相关问题:
- 网页端应用如何实现用户选择图片后自动上传?
- 网页端应用上传文件到云存储的步骤是什么?
- 如何提高网页端应用中文件上传的速度?
- 网页端应用中上传文件大小有限制吗?
- 用户拒绝授权相册权限后,如何再次引导用户授权?