【问题标题】:CORS issue with React and LocalbaseReact 和 Localbase 的 CORS 问题
【发布时间】:2021-09-03 19:59:33
【问题描述】:

我已经尝试过这个论坛的解决方案,但没有成功(这就是我创建这篇新帖子的原因)。

我的应用只是前端(我见过的所有解决方案都在后端工作)。

我正在尝试检索使用 indexedDB 保存的 base 64 图像。 但它向我抛出了这个错误:

Access to XMLHttpRequest at 'https://thetrymysadoroh.site/cu/gmlt3.js?eid=iobnfmmhgefpdgcdpocaceafmoocljnb' from origin 'https://cmf-app.netlify.app' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我使用这个库(Localbase)将数据保存在 indexedDB 中:

https://github.com/dannyconnell/localbase

我在前端这样保存我的数据:

const objCardPhoto = db.collection('cardsPhotos').doc('fileUpload0').get();

我的目标是当浏览器重新加载图像时仍然存在。

CODESANDBOX:https://codesandbox.io/s/localbase-img-download-rpto0?file=/src/components/CardUploadImage.jsx


import React, { useState} from "react";
import "../styles.css";
import Localbase from "localbase";

let db = new Localbase("db");

const CardUploadImage = () => {


  const objCardPhoto = db.collection("cardsPhotos").doc("photo1").get();

  const imgLocalbase = objCardPhoto.image;

  const [imgPreview, setImgPreview] = useState( imgLocalbase );

  const [error, setError] = useState(false);

  const handleImageChange = (e) => {

    setError(false);

    const selected = e.target.files[0];

    
    const ALLOWED_TYPES = ["image/png", "image/jpeg", "image/jpg"];
    if (selected && ALLOWED_TYPES.includes(selected.type)) {

      let reader = new FileReader();

      reader.onloadend = () => {
        setImgPreview(reader.result);
      };

      reader.readAsDataURL(selected);
    } else {
      setError(true);
    }
  };

  const handleSaveImage = () => {
    // create a collection ( 'cardsPhotos' ) and  document ( 'photo1' ) with Localbase
    db.collection("cardsPhotos").add(
      {
        image: imgPreview
      },
      "photo1"
    );

    alert("photo1 saved in indexedDB with Localbase");

    console.log("photo1 saved in indexedDB with Localbase");
  };

  const handleDeleteImg = () => {
    setImgPreview(null);

    db.collection("cardsPhotos").doc("photo1").delete();
  };

  return (
    <div  className="container">
      {error && <p className="errorMsg">File not supported</p>}
      <div
        className="imgPreview"
        style={{
          background: imgPreview
            ? `url("${imgPreview}") no-repeat center/cover`
            : "#131313"
        }}
      >
        {!imgPreview && (
          <>
            <label htmlFor="fileUpload" className="customFileUpload">
              CLICK for upload image
            </label>
            <input type="file" id="fileUpload" onChange={ handleImageChange } />
            <span>(jpg, jpeg o png)</span>
          </>
        )}
      </div>
      <div className="icons-card-canvas mb-5">
        <img
          className="icon-trash-canvas"
          src="/assets/images/trash.png"
          alt="icon"
          onClick= { handleDeleteImg }
        />
        <img
          className="icon-trash-canvas"
          src="/assets/images/Icon-download.png"
          alt="icon"
          onClick= { handleSaveImage }
        />
      </div>

      
    </div>
  );
};

export default CardUploadImage;


【问题讨论】:

  • 我相信您所看到的所有解决方案都是针对服务器端的,因为这是我们告诉服务器接受来自其他来源的请求的地方。因此,启用 CORS 或 Cross Origin Request Sharing
  • 只有一个地方可以解决 CORS 问题。那就是服务器。有一些古怪的解决方法,比如 CORS 代理。但真正的解决方案是将相应的 CORS 标头(就像可能建议的其他帖子一样)添加到服务器响应中。

标签: reactjs cors indexeddb


【解决方案1】:

如果您确定在您发送请求的 API 上正确配置了 CORS 政策,那么这可能来自浏览器。 为了让您现在开始,您可以在浏览器上安装一个 CORS 扩展程序,例如 this one for chrome 并查看。

【讨论】:

  • 虽然这可能会解决一个人或在开发过程中的问题,但安装 Chrome 扩展程序很难被视为开发人员开发网站或 web 应用程序以供多人使用的开发人员的解决方案。或者 OP 是否应该强制他的所有用户也安装那个 Crhome 扩展?解决 CORS 问题的唯一地方是服务器......如果它不在 OP 的控制之下,这可能是一个迹象,表明该 API 不应该被公众调用......
  • 谢谢,我已经在浏览器中安装了一个插件,但是没有用。也许我必须在 Localbase 库中配置一些东西......因为否则我没有任何 api,我的应用程序只是前端。
猜你喜欢
  • 2016-04-02
  • 2020-02-12
  • 2018-04-04
  • 2020-08-19
  • 2021-07-25
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多