[React] ファイル アップロード コンポーネントはビデオを Alibaba Cloud VOD にアップロードします

バックグラウンド :

前回の記事で述べたように、最近バックグラウンド管理システムにはビデオをアップロードする機能を追加する必要があり、クライアントは Alibaba Cloud VOD にアップロードする必要があり、ポータル クライアントはビデオ ファイルを Alibaba Cloud VOD にアップロードしますが、ここで重点を置くはAfter vod にビデオをアップロードする方法、vod を通じてビデオ URL をクエリし、アップロードされたビデオ リストに書き戻す方法。
これには、いくつかのファイル アップロード コンポーネントのコードが含まれます。完全なファイル アップロード コードについては、ここでは説明しません。ポータル[AntDesign] ] ファイルのカスタム アップロード コンポーネント

テクノロジースタック:

React + Antd Pro + Antd + Alibaba Cloud js SDK ビデオ オンデマンド アップロード

コード:

  
  // 上传组件 自定义上传逻辑
  const customRequest = async options => {
    
    
    const {
    
     file } = options
	const newFileList = [
        ...fileList,
        {
    
    
          uid: file.uid,
          name: file.name,
          status: 'done',
          // url: res.path,
          lastModified: file.lastModified,
          lastModifiedDate: file.lastModifiedDate,
          originFileObj: file,
          percent: 100,
          type: file.type,
          image: '',
          size: file.size,
        },
      ]

      if (newFileList.length > 0) {
    
    
      // 这里写成异步的原因是把file对象传出去父组件,在父组件进行vod上传并且通过vod查询视频url,再异步返回来, 渲染fileList
        handleMediaResource({
    
     type, fileList: newFileList }).then(res => {
    
    
          setFileList(res)
        })
      }
    }
  
  // 父组件 处理组件上传视频后, 上传vod
  const handleMediaResource = val => {
    
    
      return new Promise((resolve, reject) => {
    
    
        if (val.fileList.length > 0) {
    
    
          var a = val.fileList[0]
          // 获取上传凭证和地址
          dispatch({
    
    
            type: 'resourceList/getVodUploadCredential',
            payload: {
    
    
              params: {
    
    
                fileName: a.name,
                fileSize: a.size,
                title: a.name,
              },
              file: a,
            },
          }).then(res => {
    
    
          	// 上传到vod
            aliyunVodUpload(res, a).then(fileList => {
    
    
              resolve(fileList)
            })
          })
        } else {
    
    
          // 删除视频时
          setFieldsValue({
    
     resourceVideo: [] })
          resolve([])
        }
      })
    }

  // 上传到vod
  const aliyunVodUpload = (mes, file2) => {
    
    
    return new Promise((resolve, reject) => {
    
    
      var UploadAddress = mes.uploadAddress
      var UploadAuth = mes.uploadAuth
      var VideoId = mes.videoId
      var vod

      var uploader = new AliyunUpload.Vod({
    
    
        userId: '123',
        region: 'cn-shanghai',
        //分片大小默认1 MB,不能小于100 KB(100*1024)
        // partSize: 1000,
        //并行上传分片个数,默认5
        // parallel: 5,
        //网络原因失败时,重新上传次数,默认为3
        // retryCount: 3,
        //网络原因失败时,重新上传间隔时间,默认为2秒
        // retryDuration: 2,
        // 添加文件成功
        addFileSuccess: function() {
    
    
          console.log('添加文件成功')
          uploader.startUpload()
        },
        //开始上传
        onUploadstarted: function(uploadInfo) {
    
    
          uploader.setUploadAuthAndAddress(
            uploadInfo,
            UploadAuth,
            UploadAddress,
            VideoId
          )
        },
        //文件上传成功
        onUploadSucceed: function(uploadInfo) {
    
    
          if (uploadInfo.videoId) {
    
    
            vod = uploadInfo.videoId
            // 根据上传成功的vod反向查询视频url
            dispatch({
    
    
              type: 'resourceList/getVodPlayInfo',
              payload: {
    
    
                videoId: vod,
              },
            }).then(videoInfo => {
    
    
              var v = [
                {
    
    
                  uid: videoInfo?.videoId,
                  name: videoInfo?.title,
                  url: videoInfo?.playUrl,
                  title: file2.name,
                  vod,
                  file: file2,
                },
              ]
              setFieldsValue({
    
     resourceVideo: v })
              // 把反向查询后的fileList return给upload子组件去渲染
              resolve(v)
            })
          }
        },
        //文件上传失败
        onUploadFailed: function(uploadInfo, code, message) {
    
    
          console.log('失败上传')
        },
        //文件上传进度,单位:字节
        onUploadProgress: function(uploadInfo, totalSize, loadedPercent) {
    
    
          console.log(loadedPercent, 'loadedPercent上传进度')
        },
        //上传凭证或STS token超时
        onUploadTokenExpired: function(uploadInfo) {
    
    
          console.log('超时上传')

          uploader.resumeUploadWithAuth(UploadAuth)
        },
        //全部文件上传结束
        onUploadEnd: function(uploadInfo) {
    
    },
      })
      let file = file2.originFileObj
      uploader.addFile(file, null, null, null, '{"Vod":{}}')
    })
  }

おすすめ

転載: blog.csdn.net/qq_45481971/article/details/131232501