在 React 中单击“将图像另存为”

Posted

技术标签:

【中文标题】在 React 中单击“将图像另存为”【英文标题】:onClick "save image as" in React 【发布时间】:2020-06-10 03:06:55 【问题描述】:

我想在用户点击图片时模拟Save Image As

我阅读了this 和this 线程,但找不到答案。

我正在使用 CRA,但图像在我的服务器上不是。有什么方法可以实现吗?

这是一个沙盒:

https://codesandbox.io/s/save-image-as-react-pm3ts?file=/src/App.js


 <a
    href="https://img.mipon.org/wp-content/uploads/2019/12/14094031/logo-cover-website.png"
    download
      >
        <img
          download
          
          style= width: "300px" 
          onClick=() => console.log("should trigger save image as")
          src="https://img.mipon.org/wp-content/uploads/2019/12/14094031/logo-cover-website.png"
        />
</a>

【问题讨论】:

【参考方案1】:

下载属性将无法按预期工作,因为 Blink 引擎将阻止跨域 &lt;a download&gt;。结帐Deprecations and removals in Chrome 65。

为了避免本质上是用户介导的跨域信息 泄漏,Blink 现在会忽略下载属性的存在 在具有跨原点属性的锚元素上。请注意,这 适用于 htmlAnchorElement.download 以及元素 自己。

您可以尝试将图像绘制到画布元素并下载其 dataURL。但是这种方法只有在请求的域具有允许共享请求的Access-Control-Allow-Origin 标头时才有效。未经 CORS 批准的图像会污染画布,当您尝试使用 toDataURL() 之类的方法时,您将遇到错误 Tainted canvases may not be exported download image。在这种情况下,您可以使用 Cloudinary 之类的服务托管图像,然后使用画布下载方法即可。

这是一个使用画布下载图像的函数,您可以在 onclick 事件处理程序中使用它:

function downloadImage(src) 
  const img = new Image();
  img.crossOrigin = 'anonymous';  // This tells the browser to request cross-origin access when trying to download the image data.
  // ref: https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image#Implementing_the_save_feature
  img.src = src;
  img.onload = () => 
    // create Canvas
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    canvas.width = img.width;
    canvas.height = img.height;
    ctx.drawImage(img, 0, 0);
    // create a tag
    const a = document.createElement('a');
    a.download = 'download.png';
    a.href = canvas.toDataURL('image/png');
    a.click();
  ;

【讨论】:

以上是关于在 React 中单击“将图像另存为”的主要内容,如果未能解决你的问题,请参考以下文章

模拟右键单击图像

将图像另存为服务器上文件夹中的文件

如何将图像另存为在 retrofit2 中发送到 wcf Web 服务的流中的图像

SDL2:将图像另存为 png 错误

在特定元素上禁用移动长按上下文菜单

单击标签不会单击 React 中的复选框?