Node.js:从获取的 PNG 中获取新文件 URL

Node.js: new File from fetched PNG URL

我目前正在尝试将图像上传到 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 的答案,我认为 Google 感到困惑。我不认为我可以使用 fs 到 return 一个 File 类型。

有什么想法吗?

你可以这样做:

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)

所以您可以做的是:向文件发送 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 );

现在您的文件对象可以进行上传,如果不再需要,请不要忘记将其删除。

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

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