Node.js:来自获取的 PNG URL 的新文件

Posted

技术标签:

【中文标题】Node.js:来自获取的 PNG URL 的新文件【英文标题】:Node.js: new File from fetched PNG URL 【发布时间】:2021-09-03 03:45:35 【问题描述】:

我目前正在尝试将图像上传到 Supabase 的存储中,这看起来是 fairly simple from the docs

const  data, error  = await supabase.storage
  .from('avatars')
  .upload('public/avatar1.png', avatarFile)

不幸的是,Supabase 需要 File 类型。

在我的 API 中,我有一个指向我要保存的图像的 url,在我的 URL 中获取图像作为 Node.js 中的文件的最佳方式是什么?

我试过这个:

  let response;
  try 
    // fetch here is from the isomorphic-unfetch package so I can use it sever-side
    response = await fetch('https://example.com/image.jpeg');
   catch (err) 
    throw new Error(err);
  

  let data = await response?.blob();

  let metadata = 
    type: 'image/jpeg',
  ;

  let file = new File([data], 'test.jpg', metadata);
  return file;

但是我得到了一个ReferenceError: File is not defined,这让我相信只有浏览器才能创建一个new File()

我只能找到关于fs 的答案,我认为这让谷歌感到困惑。我认为我不能使用 fs 来返回 File 类型。

有什么想法吗?

【问题讨论】:

【参考方案1】:

你可以这样做:

const fspromise = require('fs').promises;
 let response;
  try 
    // fetch here is from the isomorphic-unfetch package so I can use it sever-side
    response = await fetch('https://example.com/image.jpeg');
   catch (err) 
    throw new Error(err);
  

  let data = await response?.blob();

  let metadata = 
    type: 'image/jpeg',
  ;

const file = blob2file(data);

function blob2file(blobData) 
  const fd = new FormData();
  fd.set('a', blobData);
  return fd.get('a');



const  data, error  = await supabase.storage
  .from('avatars')
  .upload('public/avatar1.png', file)

【讨论】:

不幸的是,这不适用于远程 URL。我认为它只是用于本地文件。 你为什么不临时下载文件并从存储中读取它并将其发送到 supabase。我会尝试想出更有效的方法来做到这一点。 不幸的是,这不是一个选项,它对 API 来说太密集了。 如果可以试试这个,其实你需要使用Filesystem来获取文件类型。【参考方案2】:

所以你可以做的是:向文件发送一个 HTTP 请求

const fs = require('fs');
const http = require('http'); // maybe https?

const fileStream = fs.createWriteStream('image.png');

const request = http.get('URL_HERE', function(response) 
  response.pipe(fileStream);
);

上面的代码从 URL 中获取文件并将其写入你的服务器,然后你需要读取它并将它发送到上传过程。

const finalFile = fs.readFileSync( 'image.png', optionsObject );

现在您已经上传了文件对象,如果不再需要,请不要忘记将其删除。

【讨论】:

createWriteStream 返回 WriteStream,而不是 File。这似乎也不起作用。 更新了我的答案,希望现在对你有帮助@Eight 感谢您的编辑,但我无法将文件写入我的服务器然后上传,这会占用大量资源。 完全正确,我会考虑另一种解决方案。【参考方案3】:

经过大量研究,这实际上是不可能的。我尝试了很多宣传能够将 blob 转换为 Files 的 npm 包,但它们似乎都不起作用。

唯一实际的解决方案是按照其他答案的建议下载文件,但在我的情况下这是不可行的。

【讨论】:

以上是关于Node.js:来自获取的 PNG URL 的新文件的主要内容,如果未能解决你的问题,请参考以下文章

Node JS请求获取原始url

如何从 php 或 node.js 获取 websocket url 路径

如何使用 node.js 在重定向 url 中获取元素

node.js获取url中的各个参数

如何显示来自 Node Js 服务器的图像

如何防止在node.js中两次调用相同URL的获取