JSPDF 在单击下载按钮时显示 CORS 策略错误

Posted

技术标签:

【中文标题】JSPDF 在单击下载按钮时显示 CORS 策略错误【英文标题】:JSPDF showing CORS policy error on clicking the download button 【发布时间】:2021-09-10 00:27:06 【问题描述】:

我是反应新手,也是 jspdf pdf 创建者的新手。单击下载时,我的 jspdf 文件中出现以下错误。

显示 cors 政策错误:

这是我生成 pdf 的函数:

generatePDF = () => 
    window.html2canvas = html2canvas;

    var doc = new jsPDF("p", "pt", "a4");

    doc.html(document.querySelector("#content"), 
      callback: function(pdf) 
        pdf.save("Coil_Details.pdf");
      
    );
  ;

这是我获取数据的函数:

getData = async () => 
    var ID = this.props.id;
    var promise = await this.getAuthorization();
    console.log("ID:" + ID);

    axios(
      method: "GET",
      url: serverDetails.jwtTokenGenerationURL,
      params: 
        "jwt-token": jwtService.GetJWT()
      
    )
      .then(response => 
        if (response.statusText != "" && response.statusText != "OK") 
          return Promise.reject(response.statusText);
         else 
          serverDetails.jwtResponse = response.data;

          //return response.data;
        
      )

      .then(response => 
        var url = "api/observation/GetCoilImages";
        url += "?jwt=" + serverDetails.jwtResponse;
        url += "&ID=" + ID;
        axiosAPI
          .get(url)

          .then(response => 
            if (response.statusText != "" && response.statusText == "OK") 
              // window.open(response.data, '_blank');

              console.log("Response:" + response.data);
              console.log("Response1:" + response.data[0]);
              var code = [];
              for (var i in response.data) 
                code[i] = response.data[i];
                console.log("Code:" + code);
              
              this.setState( code );
            

            this.setState(
              modal: !this.state.modal
            );
          );
      );
  ;

对应的C#方法是这样的:

[HttpGet]
        [Route("GetCoilImages")]
        public IHttpActionResult GetCoilImages(string jwt, string ID)
        

            List<string> coilURL = new List<string>();
            

            string connectionstring = Utilities.SQL_DB1;// our SQL DB connection
            SqlConnection conn1 = new SqlConnection(connectionstring);

            DataTable dt = new DataTable();

            string query = "Select CCD_IMAGE_URL from T_CQL_COIL_DESC where CCD_COIL_ID = '" + 
             ID + "'";

            //SqlConnection conn = new SqlConnection(connectionstring);
            SqlCommand cmd = new SqlCommand(query, conn1);
             conn1.Open();

            


            // create data adapter
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            // this will query your database and return the result to your datatable

            
            da.Fill(dt);

             if (dt.Rows.Count > 0)
            
            for (int i = 0; i < dt.Rows.Count; i++)
                
                    coilURL.Add(imgurl+dt.Rows[i]["CCD_IMAGE_URL"].ToString());
                
            




            conn1.Close();
            da.Dispose();
            return Ok(coilURL);


        

我还在 web.api.config 中处理了 cors 策略,如下所示:

namespace coilQuality

    public static class WebApiConfig
    
        public static void Register(HttpConfiguration config)
        
            // Web API configuration and services

            // Web API routes
            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);
            

            var constraints = new  httpMethod = new HttpMethodConstraint(HttpMethod.Options) ;
            config.Routes.IgnoreRoute("OPTIONS", "*pathInfo", constraints);

            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/controller/id",
                defaults: new  id = RouteParameter.Optional 
            );
        
    

如何解决这个 CORS 问题,而不是在 crome 中使用允许 cors 或 cors unblock 等扩展。请帮忙??

【问题讨论】:

【参考方案1】:

CORS policy(跨域资源共享)通常意味着不允许跨站点请求(从您的站点 (localhost) 到另一个站点 (firebase API) ),除非资源服务器明确将您列入白名单,通过使用“Access-Control-Allow-Origin”标头。

Firebase API 似乎阻止了您的请求,因为该请求来自不允许的来源,因此您需要配置 Firebase 设置以允许来自本地主机的请求。我不熟悉 FirebaseStorage,但我遇到了一些可能有帮助的 other answer(或者只是谷歌“firebase storage api cors localhost”)

【讨论】:

有什么我可以在不触碰 Firebase 的情况下做的事情吗? 很可能不是。一般来说,如果用户可以配置设置以允许自己使用,那是没有意义的——资源服务器必须明确地将用户的源列入白名单。恐怕你必须调整 Firebase

以上是关于JSPDF 在单击下载按钮时显示 CORS 策略错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在按钮单击时显示验证消息?

如何在按钮单击时显示日期选择器?

单击按钮时显示 div Javascript

如何在按钮单击时显示 DatePickerDialog? [关闭]

在操作按钮单击时显示 selectInput 和 sliderInput 值

单击时显示默认颜色的引导按钮