React antd upload组件上传视频并实现视频预览

记录问题:antd的upload组件文档中对于视频的上传预览没有明确的文档demo,在这里记录一下

项目需求:支持图片及视频的上传并实现预览,点击上传后不会立即请求接口上传资源,后续点击确定再上传

上代码

                <ProFormUploadButton
                  name="upload"
                  label="广告"
                  max={1}
                  fieldProps={{
                    accept: 'image/png,video/mp4',
                    name: 'file',
                    listType: 'picture-card',
                    maxCount: 1,
                    withCredentials: false,
                    onPreview: handlePreview,
                    previewFile: (file) => {
                      if (file.type === 'video/mp4') {
                        return new Promise((resolve, reject) => {
                          const reader = new FileReader();
                          reader.readAsDataURL(file);
                          reader.onload = () => resolve(reader.result as string);
                          reader.onerror = (error) => reject(error);
                        });
                      } else {
                        return new Promise(async (resolve) => {
                          const img = await getBase64(file as RcFile);
                          resolve(img);
                        });
                      }
                    },
                    fileList: fileList,
                    // eslint-disable-next-line @typescript-eslint/no-shadow
                    onChange: ({ fileList }) => {
                      setFileList(fileList);
                    },
                    beforeUpload: () => {
                      return false;
                    },
                  }}
                  icon={<ToTopOutlined style={{ color: '#745CC3', fontSize: 24 }} />}
                  title=""
                  rules={[{ required: true, message: '请上传图片/视频' }]}
                />
const handleCancel = () => {
    setPreviewOpen(false);
    setPreviewVideoOpen(false);
    videoRef.current.pause();
  };

  const handlePreview = async (file: any) => {
    if (file.type === 'video/mp4') {
      const current = file.originFileObj;
      const fileReader = new FileReader();
      fileReader.readAsDataURL(current);
      fileReader.onload = function (e) {
        setPreviewVideo(e.target?.result);
        setPreviewVideoOpen(true);
        setPreviewVideoTitle(file.name || file.url!.substring(file.url!.lastIndexOf('/') + 1));
      };
    } else {
      if (!file.url && !file.preview) {
        file.preview = await getBase64(file.originFileObj as RcFile);
      }
      setPreviewImage(file.url || (file.preview as string));
      setPreviewOpen(true);
      setPreviewTitle(file.name || file.url!.substring(file.url!.lastIndexOf('/') + 1));
    }
  };
        <Modal
          open={previewOpen}
          zIndex={9999}
          title={previewTitle}
          footer={null}
          centered={true}
          onCancel={handleCancel}
        >
          <img alt="example" style={{ width: '100%' }} src={previewImage} />
        </Modal>
        <Modal
          open={previewVideoOpen}
          zIndex={9999}
          title={previewVideoTitle}
          footer={null}
          centered={true}
          width={540}
          onCancel={handleCancel}
        >
          <video src={previewVideo} controls width={500} height={500} ref={videoRef}>
            您的浏览器不支持 video 标签。
          </video>
        </Modal>

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值