本文记录使用Uniapp开发小程序时,如何实现一个文件(图片)上传的功能,并且将图片上传至阿里云OSS。
基于Vue3
tsconst selectImage = () => {
  uni.chooseImage({
    count: 1,
    sizeType: ["compressed"],
    success: (file) => {
      console.log(file);
      getSignature("avatar").then((sign) => {
        // console.log(sign);
        const newName = getNewFilename(file.tempFilePaths[0]);
        // console.log(newName);
        uploadImage(sign, newName, file.tempFilePaths[0]).then((res) => {
          // console.log(res);
          imageStr.value = `${sign.host}/${sign.dir}/${newName}`;
          info.value.avatarUrl = `${sign.host}/${sign.dir}/${newName}`;
        });
      });
    },
  });
};
selectImage可以作为点击事件触发的调用方法;uni.chooseImage 触发选择本地图片的功能(打开资源管理器);count,sizeType 选择图片的限制参数,只能选择一张图片,是否允许拍照,更多配置参数请自行查阅uniapp官网:【chooseimage】,请基于自身实际情况修改。success 为选择图片后的回调函数;getSignature ,调用自己的后端接口获取授权信息,请基于自身实际情况修改。getSignature 成功后,这里对选择后的文件名进行重新生成,所以使用了 getNewFilename,请基于自身实际情况修改。file.tempFilePaths[0] 直接选择的第一张图片的名字,file.tempFilePaths[0] 获取到的是uniapp自动生成的临时文件名,一般格式是http://xxxx.jpg,请基于自身实际情况修改。uploadImage 是二次封装的上传图片接口,请看下方【上传图片】详细代码${sign.host}/${sign.dir}/${newName} 拼装成功后的图片url链接,请基于自身实际情况修改。ts
export const uploadImage = (
  param: OssSign,
  fileName: string,
  tempFilePath: string
): Promise<OssResponse> => {
  return new Promise((resolve, reject) => {
    uni.uploadFile({
      url: param.host || "", //仅为示例,非真实的接口地址
      filePath: tempFilePath,
      name: "file",
      formData: {
        // callback:  param.callback,
        OSSAccessKeyId: param.accessid,
        policy: param.policy,
        Signature: param.signature,
        success_action_status: '200',
        key: `${param.dir}/${fileName}`, // 自定义文件名
      },
      success: (res) => {
        console.log(JSON.stringify(res));
        const { statusCode, data } = res;
        if (statusCode === 200) {
          // 确保 data 是期望的类型
          const r = data as OssResponse;
          resolve(r);
        }
      },
      fail: (err) => {
        reject(err)
      }
    });
  });
};
param 是前面从 getSignature 获取到的阿里云授权参数,具体参数有哪些 请看最后的表格,更多信息可前往阿里云官方文档查阅:如何进行服务端签名直传OSS。(不得不说的是,阿里云有些文档写的是真的看不懂,乱得很)。fileName 是依据业务规则生成的新的文件名。tempFilePath 是前面提到的uniapp生成的文件临时路径,这个不能改变!uni.uploadFile 开始真正的上传文件url 是阿里云oss的地址;filePath 是uniapp的文件临时路径;name 是文件数据的属性名字,阿里云是固定的file;formData 是其他的字段,这里都是阿里云文档中标示的必选/可选字段,具体字段含义请参考阿里云文档【PostObject】。success 是上传成功后的回调函数。下面是 getSignature 接口返回的一些参数,不保证完全一致,具体情况请根据自身业务调整
| 字段名 | 含义 | 备注 | 
|---|---|---|
| expire | 由服务器端指定的Policy过期时间 | 一般可以忽略 | 
| policy | 用户表单上传的策略(Policy) | 上传必填参数 | 
| signature | 对Policy签名后的字符串 | 上传必填参数 | 
| accessid | 临时访问密钥AccessKey ID | 上传必填参数 | 
| host | Bucket域名 | 如果没有自定义域名,则一般是阿里云oss服务的域名,上传图片时调用的地址就是该值,同时也是图片URL的域名 | 
| callback | 回调 | 如果上传图片成功后需要阿里云回调自身服务器接口,可在上传图片是传入该参数 | 
| dir | 限制上传的文件前缀 | 大概是需要拼接到文件名上的,即上面代码 formData中的key | 
使用Uniapp实现图片上传还是比较简单的,而且在电脑端模拟器中也可以进行相关调试,其他类型文件上传也可以参考本文内容,逻辑大致相同,总结要点步骤如下:
uni.chooseImage 来实现选择图片的功能,当然也可以使用其他方法,如 uni.chooseMedia 等;uni.uploadFile 快速实现上传图片接口的调用;callback 参数,则回调接口要保证正确,如果阿里云回调发生错误,可能会判定为图片上传失败,但其实图片上传成功了,只是回调失败,务必注意!建站因为热爱,生活需要Money,请屏幕前的大佬动动您发财的小手,点击一次以示鼓励,祝您生活愉快!
PS:就目前的访问量,即便每个访客都点一次广告,收入也不足以支付运营成本。
如果看不到广告,可能是网络原因或被拦截了,那就算了吧。再次祝您生活愉快~~
本文作者:DingDangDog
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!