当前位置: 首页 > 知识库问答 >
问题:

火力储存库的奇怪行为

顾恺
2023-03-14

我正在开发一个应用程序,用户可以看到一组缩小的图像,然后按“确定”下载所有的原始文件,将它们放入压缩文件并发送压缩文件。

该应用程序使用聚合物,聚合火,火力(包括存储)。

在上传图像期间,我将原始文件和缩小后的文件的下载网址和存储参考都保存在数据库中。

当我将下载url放在iron image元素中以在浏览器中显示图像时,一切都很正常,缩小的图像显示在屏幕上。当我试图通过XMLHttpRequest()下载完整大小的图像时,我得到了Cors错误。我不明白为什么,两个请求都来自同一个应用程序,为什么两个不同的cors响应?

for (var z = 0; z < visita.immagini.length; z++) {
  var immagine =visita.immagini[z]

  var storage = firebase.storage();
  var pathReference = storage.ref('immagini/'+ immagine.original.ref);
  pathReference.getDownloadURL().then(function(url) {

    var xhr = new XMLHttpRequest();
    xhr.responseType = 'blob';
    xhr.onload = function(event) {
      var blob = xhr.response;
      console.log(blob);
    };
    xhr.open('GET', url);
    xhr.send();
  }).catch(function(error) {
      console.log(error);
  });

}

下面是错误响应:

XMLHttpRequest无法加载******[image link]*****。请求的资源上不存在“Access Control Allow Origin”标头。起源'http://localhost:3000因此,不允许访问。

请注意,如果我复制***[image link]******并将其放入浏览器的另一个选项卡中,我可以毫无问题地看到。

共有2个答案

洪子晋
2023-03-14

Firebase"部署配置"留档中关于标题的部分指出,要启用对映像的跨源请求,您必须在您的firebase.json中添加如下内容:

"headers": [ {
  "source" : "**/*.@(jpg|jpeg|gif|png)",
  "headers" : [ {
    "key" : "Access-Control-Allow-Origin",
    "value" : "*"
  } ]
} ]

当我将下载url放在iron image元素中以在浏览器中显示图像时,一切都很正常,…当我尝试通过XMLHttpRequest()下载全尺寸图像时,我得到了Cors错误。我不明白为什么,两个请求都来自同一个应用程序,为什么两个不同的cors响应?

因为浏览器会阻止跨源XHR请求,除非接收请求的服务器使用CORS来允许它们,通过访问控制允许源:头进行响应。

请注意,如果我复制***[image link]******并将其放入浏览器的另一个选项卡中,我可以毫无问题地看到。

这是意料之中的。当您将一个网址放入浏览器的地址栏时,它不是一个跨源请求——相反,它只是您直接导航到一个网址。

但是,当您将该URL放入在Web上某个源运行的Web应用程序的JavaScript中时,当发送该请求时,不是您直接导航到该URL,而是某个Web应用程序向另一个Web站点发出跨源请求。

因此,浏览器默认会阻止Web应用中运行的JavaScript发出的此类跨源请求。但是要选择接收这样的请求,站点可以在其对浏览器的响应中包含Access-Control-允许-起源:*标头。如果浏览器看到该标头,它不会阻止请求。

有关更多详细信息,请参阅MDN的HTTP权限改造(CORS)一文。

仲孙鸿畴
2023-03-14

我终于按照要求找到了一些关于CORS存储的信息。查看存储在这里的Firebase文档:https://firebase.google.com/docs/storage/web/download-files#cors_configuration.

首先,您需要gsutil(https://cloud.google.com/storage/docs/gsutil_install)。

然后在项目中的某个地方创建一个名为cors.json的文件,内容如下:

[
  {
    "origin": ["*"],
    "method": ["GET"],
    "maxAgeSeconds": 3600
  }
]

最后运行:gsutil cors setcors.jsongs://

这些步骤对我有用!

这里也回答了这个问题:Firebase存储和访问控制允许起源,这是我在回答后发现的。

 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

  • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

  • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况

  • 问题内容: 我有上面的代码,但我不知道为什么会产生 而不是 非常感谢 问题答案: 使用量词来匹配1个或多个空格,而不是:- 表示匹配0个或多个空格,并且将在每个字符之前匹配一个空字符,并由一个空格代替。