第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React Image-crop 顯示錯誤,因為它沒有以正確的形式上傳圖像,并且從后端收到錯誤

React Image-crop 顯示錯誤,因為它沒有以正確的形式上傳圖像,并且從后端收到錯誤

qq_花開花謝_0 2023-07-14 10:25:21
我在使用 上傳裁剪后的圖像時遇到錯誤react-image-crop。我想,我在上傳之前沒有正確地將 base64 轉換為文件類型,或者該函數(shù)沒有運行?我對 React 和 javascript 很陌生,很多事情仍然讓我感到困惑。任何人都可以看一下代碼并幫助解決問題嗎?我正在使用 django 休息 api。這是該包的鏈接:https://github.com/DominicTobias/react-image-crop這是我在上傳時從后端收到的錯誤。{profile_pic: ["The submitted data was not a file. Check the encoding type on the form."]}profile_pic: ["The submitted data was not a file. Check the encoding type on the form."]這是代碼。
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻1906條經(jīng)驗 獲得超3個贊

這段代碼中不需要使用useEffect和useCallback 。ReactCrop 為您提供了 onComplete,因此您唯一需要做的就是在那之后開始繪圖。

API錯誤:

在上面的代碼中,您將 base64 字符串發(fā)送到 api,但正如我們在錯誤 api 中看到的,文件格式除外。還需要將名稱設置為 blob才能識別為文件。

我收集了這些更改,并且此代碼應該可以工作:

export default function ProfilePicEdit() {

  const [upImg, setUpImg] = useState();

  const imgRef = useRef(null);

  const canvasRef = useRef(null);

  const [crop, setCrop] = useState({ unit: "%", width: 30, aspect: 1 / 1 });

  const croppedImage = useRef(null);


  const onSelectFile = (e) => {

    if (e.target.files && e.target.files.length > 0) {

      const reader = new FileReader();

      reader.addEventListener("load", () => setUpImg(reader.result));

      reader.readAsDataURL(e.target.files[0]);

    }

  };


  const onLoad = (img) => {

    imgRef.current = img;

  };


  const onCropComplete = (crop) => {

    makeClientCrop(crop);

  };


  const makeClientCrop = async (crop) => {

    if (imgRef.current && crop.width && crop.height) {

      croppedImage.current = await getCroppedImg(

        imgRef.current,

        crop,

        "newFile.jpeg"

      );

    }

  };


  const getCroppedImg = (image, crop, fileName) => {

    if (!canvasRef.current || !imgRef.current) {

      return;

    }

    const canvas = canvasRef.current;

    const scaleX = image.naturalWidth / image.width;

    const scaleY = image.naturalHeight / image.height;

    const ctx = canvas.getContext("2d");


    canvas.width = crop.width * pixelRatio;

    canvas.height = crop.height * pixelRatio;


    ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);

    ctx.imageSmoothingQuality = "high";

    ctx.drawImage(

      image,

      crop.x * scaleX,

      crop.y * scaleY,

      crop.width * scaleX,

      crop.height * scaleY,

      0,

      0,

      crop.width,

      crop.height

    );


    return new Promise((resolve, reject) => {

      canvas.toBlob((blob) => {

        if (!blob) {

          //reject(new Error('Canvas is empty'));

          console.error("Canvas is empty");

          return;

        }

        blob.name = fileName;

        resolve(blob);

      }, "image/jpeg");

    });

  };


  const onSubmit = (e) => {

    let formData = new FormData();

    formData.append("profile_pic", croppedImage.current,

      croppedImage.current.name);


    axiosInstance.put('api/profile/update/', formData)

    window.location.reload();

  };


  return (

    <div className="imagecropper">

        <form className={classes.form} noValidate onSubmit={handleSubmit(onSubmit)}>

        <div>

          <label htmlFor="profile-pic">

            <input

              accept="image/*"

              id="profile-pic"

              onChange={onSelectFile}

              name="image"

              type="file"

            />

            <div className="profile_pic__edit_main">

              <img

                style={{ width: 40, height: 40 }}

                src={upImg}

                className="profile__pic_edit"

                alt=""

              />

            </div>

          </label>

        </div>

        <ReactCrop

          src={upImg}

          onImageLoaded={onLoad}

          crop={crop}

          onChange={(c) => setCrop(c)}

          onComplete={onCropComplete}

        />

        <div>

          <canvas

            ref={canvasRef}

          />

        </div>

            <Button

                type="submit"

                fullWidth

                variant="contained"

                color="primary"

                className={classes.submit}

            >

                Update

            </Button>

    </form>

    </div>

  );


}


查看完整回答
反對 回復 2023-07-14
  • 1 回答
  • 0 關注
  • 280 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號