react处理图片base64位上传

本文介绍如何在React应用中利用antd的Upload组件处理图片的base64编码上传,包括图片地址转base64及解决部分跨域问题的方法。

1.react处理图片base64位上传,使用react+antd的Upload组件

const [pice,setPice] = useState() //定义图片的默认值

//定义图片转base64方法
  function customRequest(option) {
    const formData = new FormData();
    formData.append("files[]", option.file);
    const reader = new FileReader();
    reader.readAsDataURL(option.file);
    reader.onloadend = function(e) {
      console.log(e.target.result);// 打印图片的base64
      setPice(e.target.result)
      if (e && e.target && e.target.result) {
        option.onSuccess();
      }
    };
  }

	//请求接口
 const onFinish = (values) => {
    console.log(id, values);
    getRegister({
      id: id,
      title: values.title,
      picture:pice,
    }).then(res => {
      console.log(res);
      message.success(res.data)
    })
  }
 
 //至关重要
const props = {
    customRequest: customRequest,  //调用base64方法
    showUploadList: true, // 页面展示文件列表
    // beforeUpload: beforeUpload
  };

const uploadButton = (
    <div>
      <PlusOutlined />
      <div
        style={{
          marginTop: 8,
          color: "#1890FF"
        }}
      >
        上传图片
      </div>
    </div>
  );

return (
    <div id='map'>
            <Form className='form'
              labelCol={{
                span: 2,
              }}
              wrapperCol={{
                span: 18,
              }}
              layout="horizontal"
              // onValuesChange={onFormLayoutChange}
              onFinish={onFinish}
            >
              <Form.Item label="图片" name="picture" >
                <Upload {...props}   //至关重要
                // action={getRegister}
                  listType="picture-card"
                  fileList={fileList}
                  onPreview={handlePreview}
                  // onChange={handleChange}
                  >
                  { uploadButton}
                </Upload>
              </Form.Item>
    </div>
  )

2.图片地址转base64上传

const [Img, setImg] = useState() //完整的base64位地址
const [Imgs, setImgs] = useState() //去掉data:image/jpeg;base64,的地址
let imgUrl = "https://img2.baidu.com/it/u=119687581,2050452551&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1670691600&t=d2d54e983720723fedcb1e47b44f8f83"

useEffect(getBase64(imgUrl), [])

  const getBase64 = (imgUrl) => {
    window.URL = window.URL || window.webkitURL;
    var xhr = new XMLHttpRequest();
    xhr.open("get", imgUrl, true);
    // 至关重要
    xhr.responseType = "blob";
    xhr.onload = function () {
      if (this.status == 200) {
        //得到一个blob对象
        var blob = this.response;
        console.log("blob", blob)
        // 至关重要
        let oFileReader = new FileReader();
        console.log(oFileReader);
        oFileReader.onloadend = function (e) {
          // 此处拿到的已经是 base64的图片了
          let base64 = e.target.result;
          let base = base64.split(',')[1]
          // console.log("方式一》》》》》》》》》", base64)
          // console.log(base);
          setImgs(base64)
          setImg(base)
        };
        oFileReader.readAsDataURL(blob);
      }
    }
    xhr.send();
  }

3.图片url地址转base64上传(解决跨域问题)。注:只能解决大多跨域问题,有一些还是需要配合后端解决。

 let image = 'https://static.veer.com/veer-v2/cms/20221223/41fa74744c5b4c2ebac19039891fb9f7.jpg'
  getBase64(image).then((res)=>{
    console.log(res);  // 图片base64位地址
  })
  function getBase64(img_url) {
    debugger;
    function toBase64(image) {
      const canvas = document.createElement('canvas');
      canvas.width = image.width;
      canvas.height = image.height;
      const ctx = canvas.getContext('2d');
      ctx.drawImage(image, 0, 0, image.width, image.height);
      const base64 = canvas.toDataURL('image/png');hongkong
      return base64;
    }
    
    return new Promise((resolve, reject) => {
      const image = new Image();
      image.setAttribute('crossOrigin', 'anonymous'); // 解决跨域
      image.crossOrigin = '*';
      image.src = img_url + '?v=' + Math.random();  // 解决图片URL缓存问题
      image.onload = () => {
        console.log("111");
        resolve(toBase64(image));
      };
    });
  }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值