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 转换为 File
s,但其中 none 似乎有效。
唯一实际的解决方案是按照其他答案的建议下载文件,但在我的情况下这是不可行的。
我目前正在尝试将图像上传到 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 转换为 File
s,但其中 none 似乎有效。
唯一实际的解决方案是按照其他答案的建议下载文件,但在我的情况下这是不可行的。