Gatsby GraphQL 一次下载多个图像

Gatsby GraphQL download multiple images at once

这个查询

query MyQuery {
  allStrapiLogos {
    nodes {
      id
      Image {
        localFile {
          publicURL
        }
      }
    }
  }
}

提供以下结果:

{
  "data": {
    "allStrapiLogos": {
      "nodes": [
        {
          "id": "Logos_1",
          "Image": [
            {
              "localFile": {
                "publicURL": "someUrl.png"
              }
            },
            {
              "localFile": {
                "publicURL": "someUrl.png"
              }
            }
          ]
        },
        {
          "id": "Logos_2",
          "Image": [
            {
              "localFile": {
                "publicURL": "/someUrl.png"
              }
            }
          ]
        },
        {
          "id": "Logos_3",
          "Image": [
            {
              "localFile": {
                "publicURL": "someUrl.svg"
              }
            }
          ]
        }
      ]
    }
  },
  "extensions": {}
}

平时我的做法是这样的:

  <Link to={publicURL}>
          <ReactSVG wrapper="span" src={svgIcons.download} style={{ paddingRight: '16px' }} />
        </Link>

这始终适用于 1 个文件。我不确定一次下载多张图片的最佳方法是什么。
GraphQL 查询由 the gatsby-source-plugin 生成。 有什么想法吗?

So my issue is that I do not know how a user can download all the images by clicking on a link.

鉴于这种情况,我建议避免使用 Link 组件,因为它不符合您的要求。

我会做类似的事情:

  <button onClick={downloadAllItems}>Download</button>

然后,在你的函数中:

  const downloadAllItems=()=>{
    data.allStrapiLogos.nodes.forEach(node=> window.open(`/yoursite.com/${node.Image.localFile.publicUrl}`))
  }

修改自:

  • How can I let a user download multiple files when a button is clicked?
  • How to make a link open multiple pages when clicked

如果按钮位于表单内,则在循环之前添加一个 event.preventDefault,以避免需要时出现不需要的请求。

考虑到您的用例,我认为使用一键式功能下载所有项目是更直观的方法。

您可以通过设置 window.open 并保存内存引用并在回调中设置位置来绕过浏览器(或 adblock)的限制:

let newWindow=window.open(...)

然后:

newWindow.location=`/yoursite.com/${node.Image.localFile.publicUrl}`