uploadCloud.ets 4.0 KB
import fs from '@ohos.file.fs';
import { request, BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI'
import { photoAccessHelper } from '@kit.MediaLibraryKit'
import { getCosKey, cosKeyTest, cosKeyData, uploadVideoOrImg } from '../api/cosKey'
import { AxiosResponse } from '@ohos/axios'


// 选择一张图片或视频
export async function selectImgOrVideo(){
  // 1. 创建参数对象
  const opts = new photoAccessHelper.PhotoSelectOptions() // 创建参数对象
  opts.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE // 设置MIME类型
  opts.maxSelectNumber = 1 // 设置最大选择数量
  // 2. 创建选择器对象
  const photoPicker = new photoAccessHelper.PhotoViewPicker() // 创建选择器对象
  const photos = await photoPicker.select(opts) // 选择文件
  return photos.photoUris[0] // 返回文件路径
}

/**
 * 上传文件(通过uploadTask实现)
 * @param context context
 * @param media 媒体文件
 */
 export async function uploadFileByTask(cosKeyStr: string, relateId: number, systemPhotoImagePath: string) {
   let fileArr = systemPhotoImagePath.split('/')
   let index = fileArr.length - 1
   let filenames = fileArr[index] // 设置文件名称
   // 获取直传签名等数据
   let ext = filenames.split('.')[1] // 文件后缀
   let filename = Date.now() + '.' + ext // 设置图片名称
  let directTransferResult: AxiosResponse<cosKeyTest>  = await getCosKey(filename);
  let directTransferData: cosKeyData = directTransferResult.data.data
   if (directTransferData == null) {
     promptAction.showToast({ message: 'getStsDirectSign fail' });
     return;
   }
   let cosKey = directTransferData.coskey
  // 生成上传的url
  let url = directTransferData.preSignedUrl
  try {
    let cacheDir = getContext().cacheDir // 获取缓存目录
    let fullPath = cacheDir + '/' + filename // 设置图片路径
    const file = fs.openSync(systemPhotoImagePath, fs.OpenMode.READ_ONLY) // 打开图片
    // 复制uri文件到cacheDir(因为request.uploadFile只接受internal:类型的路径)
    fs.copyFileSync(file.fd, fullPath) // 复制图片
    // 开始上传
    try {
      let uploadTask = await request.uploadFile(getContext(),{ // 上传图片
        url: url, // 请求地址
        // 请求头
        header:{
          "Content-Type": "application/octet-stream"
        },
        method: "PUT",
        files:[{ // 上传文件
          filename: filename, // 文件名
          type: ext, // 文件扩展名
          name:'file', // 接口参数名
          uri:`internal://cache/${filename}` // 缓存目录中的要上传给服务器的图片路径
        }],
        data:[]
      })
      // 成功后响应
      uploadTask.on('progress', (uploadSize, totalSize) => {
        console.log('上传进度--->', uploadSize, totalSize)
      });
      // 上传成功
      uploadTask.on('complete', async (taskStates: Array<request.TaskState>) => {
        for (let i = 0; i < taskStates.length; i++) {
          let cosKeyArr: string[] = []
          if(cosKeyStr !== '') {
            cosKeyArr = cosKeyStr.split(';')
          }
          cosKeyArr.push(cosKey)
          console.log('cosKeyArr--->', cosKeyArr.join(';'), relateId)
          await uploadVideoOrImg({ cosKey: cosKeyArr.join(';'), relateId: relateId })
          promptAction.showToast({ message: '上传成功' });
        }
      });
      // 上传失败
      uploadTask.on('fail', (taskStates: Array<request.TaskState>) => {
        for (let i = 0; i < taskStates.length; i++) {
          promptAction.showToast({ message: '上传失败' });
        }
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
    }

  } catch (err) {
    console.info("uploadFile Error sending PUT request: " + JSON.stringify(err));
    promptAction.showToast({ message: "uploadFile Error sending PUT request: " + JSON.stringify(err) });
  }
}