【问题标题】:HTML download file button only saving as HTML documentHTML 下载文件按钮仅保存为 HTML 文档
【发布时间】:2020-07-02 13:51:29
【问题描述】:

我正在尝试向我的 gatsby 网站添加一个“下载文件”按钮,如下所示:

<a
    href="../../images/project-logos/placeholder-company-logo.png"
    download="test"
    className="responsive-square project-logo"
>
    <img
        src={
            props.logo ??
            require("../../images/project-logos/placeholder-company-logo.png")
        }
        alt="Company Logo"
        className="logo-img"
    />
</a>

该图像 100% 存在于该位置,因为它由正下方的 &lt;img&gt; 标记显示,但是当我单击它时,它会打开下载菜单,并且只允许我另存为类型:HTML 文档。如何让它识别出它是一个 png?

【问题讨论】:

  • 整个require() 业务在src 属性上对我来说是可疑的。我不使用 React,但 require() 不会用于加载模块吗?为什么不直接输出字符串文字?什么 HTML 最终在 DOM 中结束?您的 HTTP 请求/响应是什么样的?
  • 你就不能(props.logo ?? &lt;img ... /&gt;)吗?
  • @J.Ko 否,因为我想使用 props.logo 作为 src url,但如果未定义,则使用 placeholder-company-logo.png 作为后备

标签: javascript reactjs gatsby


【解决方案1】:

我不太熟悉(我假设是 Gatsby 特有的)require(...) 表达式作为 img src 属性。

话虽如此,这个sandbox 希望足以作为一个例子来解决您的问题。

基本功能如下所示:

  const [downloadUrl, setDownloadUrl] = useState(null);
  const downloadOnClick = () => {
    // Create a canvas element to "export" the image from
    const canvas = document.createElement("canvas");

    // set desired size of transparent image
    canvas.width = 200;
    canvas.height = 200;

    // extract as new image (data-uri)
    const url = canvas.toDataURL();
    setDownloadUrl(url);
  };

  ...
  
  <a
    onClick={() => downloadOnClick()}
    href={downloadUrl ?? "https://via.placeholder.com/200"}
    download="test"
    className="responsive-square project-logo"
  >

如需进一步阅读(以及此答案的依据),请查看此post

希望这会有所帮助!

【讨论】:

  • 通过document. 直接访问 DOM 是一种不好的做法,应该避免,因为您正在 React 和 Gatsby 中创建虚拟 DOM。 require 是一个 JavaScript 函数,不是 Gatsby 特有的。
【解决方案2】:

当您在 React 中处理图像源(以及由于 webpack 的配置而导致的 Gatsby)时,您应该将它们作为组件导入,并且导入的组件应该是源,例如:

// other imports
import MyImage from "../../images/project-logos/placeholder-company-logo.png"

const MyComponent = () =>{

return <a
    href="../../images/project-logos/placeholder-company-logo.png"
    download="test"
    className="responsive-square project-logo"
>
    <img src={props.logo && MyImage}
        alt="Company Logo"
        className="logo-img"
    />
</a> 
}

此外,在这种情况下,您的逻辑运算符应该是&amp;&amp;,因为它是一个布尔条件。你想打印props.logo(如果存在)。

更多关于importing images and assets with Gatsby的信息。

【讨论】:

  • 感谢您的回复,将尽快试用!至于 && 运算符,我不相信我想要那个功能,除非我误解了它。我希望它显示 props.logo url,除非它是未定义的,然后显示 MyImage。如果我使用 && 并且 props.logo 是未定义的,它不会只返回 false 并且没有任何 src 吗?
  • 刚刚尝试将图像作为组件导入,但仍然得到相同的结果,只允许保存为 HTML 文档:(我将把问题发布给 Gatsby 看看他们必须做什么说说吧
猜你喜欢
  • 2011-08-02
  • 2013-07-16
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2012-02-21
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多