- 背景:小程序个人中心,修改个人信息上传头像。
- 用到的方法
- uni.chooseImage。其中关键的一步上传
const uploadTask = uni.uploadFile(uploadConfig);
- uni.uploadFile
- 需要注意。上传成功后获取的路径
http://temp/.....
无法访问。但对接uni.uploadFile文件后可以成功上传文件到自己定义的文件上传接口ap*****t/sys/upload
,以及可用通过代理接口进行回显http://localhost:8068/s******ss/proxy
。这连个地方可以再下面代码区域搜索到
3. 下方提供的代码路径写死了,不规范,可以通过获取全局的访问路径进行配置。
const uploadTask = uni.uploadFile(uploadConfig);
<!-- 头像上传区域 -->
<view class="avatar-section"><view class="avatar-container" @click="chooseAvatar"><imageclass="avatar":src="formData.avatar || defaultAvatar"mode="aspectFill"@error="handleAvatarError"></image><view class="avatar-overlay"><u-icon name="camera" size="24" color="#fff"></u-icon><text class="avatar-text">点击更换头像</text></view></view>
</view>
...
methods: {chooseAvatar() {console.log('chooseAvatar.token', this.getToken());uni.chooseImage({success: (chooseImageRes) => {const tempFilePaths = chooseImageRes.tempFilePaths;this.uploadAvatar(tempFilePaths[0]);}});},async uploadAvatar(filePath) {uni.showLoading({title: '上传中...'});try {const uploadResult = await this.uploadToOSS(filePath);console.log('uploadResult', uploadResult);if (uploadResult.success) {this.formData.avatar = uploadResult.proxyUrl;this.formData.bucket = uploadResult.bucket;this.formData.object = uploadResult.object;this.formData.ossData = {bucket: uploadResult.bucket,object: uploadResult.object,ossId: uploadResult.ossId};uni.hideLoading();uni.showToast({title: '头像上传成功',icon: 'success'});} else {throw new Error(uploadResult.message || '上传失败');}} catch (error) {console.error('上传头像失败:', error);uni.hideLoading();uni.showToast({title: '上传失败,请稍后重试',icon: 'none'});}},async uploadToOSS(filePath, options = {}) {console.log('uploadToOSS', filePath);return new Promise((resolve, reject) => {console.log('uploadToOSS2', filePath);if (options.showProgress !== false) {uni.showLoading({title: '上传中...'});}const uploadConfig = {url: 'http://localhost:8068/a*****t/sys/upload', filePath: filePath, name: 'file', header: {Authorization: 'Bearer ' + this.getToken()},timeout: options.timeout || 60000, formData: options.formData || {}, success: (res) => {try {const result = JSON.parse(res.data);console.log('uploadToOSS3', result);if (result.code === 200) {const { fileName, url, ossId, bucket, object } = result.data;const proxyUrl = `http://localhost:8068/s******ss/proxy?bucket=${bucket}&object=${encodeURIComponent(object)}`;resolve({success: true,fileName,url,proxyUrl,ossId,bucket,object,statusCode: res.statusCode});} else {resolve({success: false,message: result.msg || '上传失败',statusCode: res.statusCode});}} catch (error) {resolve({success: false,message: '解析响应失败',error: error.message});}},fail: (error) => {resolve({success: false,message: '网络请求失败',error: error.errMsg || error.message});},complete: () => {if (options.showProgress !== false) {uni.hideLoading();}}};console.log('uploadToOSS3.token', this.getToken());const uploadTask = uni.uploadFile(uploadConfig);if (options.onProgress) {uploadTask.onProgressUpdate((res) => {options.onProgress({progress: res.progress,totalBytesSent: res.totalBytesSent,totalBytesExpectedToSend: res.totalBytesExpectedToSend});});}if (options.returnTask) {resolve({uploadTask,promise: new Promise((innerResolve, innerReject) => {uploadConfig.success = (res) => {try {const result = JSON.parse(res.data);if (result.code === 200) {const { fileName, url, ossId, bucket, object } = result.data;const proxyUrl = `/system/oss/proxy?bucket=${bucket}&object=${encodeURIComponent(object)}`;innerResolve({success: true,fileName,url,proxyUrl,ossId,bucket,object,statusCode: res.statusCode});} else {innerReject(new Error(result.msg || '上传失败'));}} catch (error) {innerReject(new Error('解析响应失败'));}};uploadConfig.fail = (error) => {innerReject(new Error(error.errMsg || '网络请求失败'));};})});}});}
}