FireProtectionDetail.ets 7.3 KB
import { router, promptAction } from '@kit.ArkUI'
import { ProjectList } from '../api/recordsType'
import { webview } from '@kit.ArkWeb'
import { basePath } from '../utils/baseUrl'
import fs from '@ohos.file.fs';
import preferencesUtils from '../utils/preferences'
import { BusinessError, request } from '@kit.BasicServicesKit';
import { cameraPickerImg, cameraPickerVideo, videoCompressMethod } from '../utils/uploadFile'
import { getCosKey, cosKeyTest, cosKeyData, uploadVideoOrImg } from '../api/cosKey'
import loadingDialog from '../dialog/LoadingDialog'
import { rpc } from '@kit.IPCKit';
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { AxiosResponse } from '@ohos/axios'

let routerInfo: ProjectList = router.getParams() as ProjectList
const context = getContext() as common.UIAbilityContext;

@Entry
@Component
struct FireProtectionDetail {
  controller: RichEditorController = new RichEditorController();
  options: RichEditorOptions = { controller: this.controller };
  @State projectInfo: ProjectList = routerInfo
  private result: boolean = false;
  permissions: Array<Permissions> = [
    'ohos.permission.CAMERA',
    'ohos.permission.MICROPHONE',
    'ohos.permission.MEDIA_LOCATION'
  ];
  webviewController: webview.WebviewController = new webview.WebviewController()

  aboutToAppear(): void {
    this.reqPermissionsFromUser(this.permissions, context)
  }
  // 加载弹窗
  loadingController: CustomDialogController = new CustomDialogController({
    builder: loadingDialog(),
    customStyle: true,
    offset: { dx: 0, dy: 0 },
    alignment: DialogAlignment.Center,
    autoCancel: false
  })

  // 获取用户授权
  reqPermissionsFromUser(permissions: Array<Permissions>, context: common.UIAbilityContext) {
   let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionsFromUser(context, permissions).then((data) => {
      let grantStatus: Array<number> = data.authResults;
      let length: number = grantStatus.length;
      for (let i = 0; i < length; i++) {
        if (grantStatus[i] === 0) {
          promptAction.showToast({message: 'User authorized.'})
        } else {
          promptAction.showToast({message: 'User denied authorization.'})
          return;
        }
      }
    }).catch((err: BusinessError) => {
      promptAction.showToast({message: `Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`})
    })
  }
  // 检查用户是否授权
  checkAccessToken(permissions: Array<Permissions>) {
    // Determine the authorization status.
    let callerTokenId: number = rpc.IPCSkeleton.getCallingTokenId();
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    try {
      for (let i = 0; i < permissions.length; i++) {
        let data: abilityAccessCtrl.GrantStatus = atManager.verifyAccessTokenSync(callerTokenId, permissions[i]);
        if (data === -1) {
          this.result = false;
        } else {
          this.result = true;
        }
        if (!this.result) {
          break;
        }
      }
    } catch (err) {
      promptAction.showToast({message: `checkAccessToken catch err->${JSON.stringify(err)}`})
    }
  }

  // 上传方法
  uploadMethods = async (cosKeyStr: string | null, relateId: number, systemPhotoImagePath: string, fileType: string) => {
    let _this = this
    _this.loadingController.open()
    let cacheDir = getContext().cacheDir // 获取缓存目录
    let filetype = fileType // 设置文件类型
    let filename = Date.now() + '.' + filetype // 设置文件名称
    let fullPath = cacheDir + '/' + filename // 设置文件路径
    const file = fs.openSync(systemPhotoImagePath, fs.OpenMode.READ_ONLY) // 打开文件
    fs.copyFileSync(file.fd, fullPath) // 复制文件
    // 获取直传签名等数据
    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 uploadTask = await request.uploadFile(getContext(),{ // 上传图片
        url: url, // 请求地址
        // 请求头
        header:{
          "Content-Type": "application/octet-stream"
        },
        method: "PUT",
        files:[{ // 上传文件
          filename: filename, // 文件名
          type: 'jpg', // 文件扩展名
          name:'file', // 接口参数名
          uri:`internal://cache/${filename}` // 缓存目录中的要上传给服务器的图片路径
        }],
        data:[]
      })
      // 上传成功
      uploadTask.on('complete', async (taskStates: Array<request.TaskState>) => {
        _this.loadingController.close()
        for (let i = 0; i < taskStates.length; i++) {
          let cosKeyArr: string[] = []
          if(cosKeyStr !== null) {
            cosKeyArr = cosKeyStr.split(';')
          }
          cosKeyArr.push(cosKey)
          console.log('最终的cosKeys数据: ' + cosKeyArr.join(';'))
          await uploadVideoOrImg({ cosKey: cosKeyArr.join(';'), relateId: relateId })
          await _this.webviewController.runJavaScript(`window.setKey(${JSON.stringify(cosKeyArr.join(';'))})`)
          _this.loadingController.close()
        }
      });
      // 上传失败
      uploadTask.on('fail', (taskStates: Array<request.TaskState>) => {
        _this.loadingController.close()
        for (let i = 0; i < taskStates.length; i++) {
          promptAction.showToast({ message: '上传失败' });
          _this.loadingController.close()
        }
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
      return error
    }
  }
  build() {
    Column(){
      Web({
        src: `${basePath}/report/handle?id=${this.projectInfo.reportId}&pid=${this.projectInfo.projectId}&source=harmony&token=${preferencesUtils.get('XF_TOKEN', '')}`,
        // src: 'http://www.xiao-ming.love/',
        controller: this.webviewController,
      }).mixedMode(MixedMode.All).javaScriptAccess(true).domStorageAccess(true)
        .onConsole((event) => {
          let data = event.message.getMessage().replace(/^['"]|['"]$/g, '');
          let formatData = data.split('&')
          let cosKeyStr: string | null = formatData[1]
          let relateId: number = parseInt(formatData[2])
          if (formatData[0] == '鸿蒙图片上传') {
            // 使用相机拍照
            cameraPickerImg().then(async systemPhotoImagePath => {
              if (systemPhotoImagePath == '' || systemPhotoImagePath == null) {
                return promptAction.showToast({ message: '用户取消选择' });
              }
              this.uploadMethods(cosKeyStr, relateId, systemPhotoImagePath, 'jpg')
            })
          } else if(formatData[0] == '鸿蒙视频上传'){
            // 使用相机录像
            this.checkAccessToken(this.permissions);
            if (this.result) {
              router.pushUrl({ url: 'pages/CreateCamera', params: { cosKeyStr: cosKeyStr, relateId: relateId} })
            }
          }
          return false
        })
    }.height('100%').width('100%')
  }
}