【发布时间】:2021-10-19 23:36:31
【问题描述】:
我正在寻找将文件上传到将文件流式传输到输出的 graphql 端点。 在 graphql 服务器上,它看起来像 apollo 的基本示例。
async uploadFile(
@Args({ name: 'file', type: () => GraphQLUpload }) file,
@CurrentUser() user,
): Promise<string> {
const { createReadStream, filename } = await file;
// for uploading temporary nfts
const randomFileName = generateRandomFileName(filename);
const readStream = createReadStream();
const out = fs.createWriteStream(path.join(__dirname, randomFileName));
readStream.pipe(out);
await finished(out);
}
使用graphqlUploadExpress 中间件
graphqlUploadExpress({ maxFileSize: 1024 * 1024 * 100, maxFiles: 1 })
使用 React.JS 上传时,一切正常。但是,当使用 Node.JS 客户端时,它无法上传。图像大小翻倍,未设置 mimetype,图像不可见。
我尝试了不同的方法,但我认为这与通过的读取流有关。
const fileStream = await fs.createReadStream(
path.join(__dirname, "image.png"),
{
encoding: "utf8",
}
);
const response = await request(
GRAPHQL_URL,
UPLOAD,
{
file: fileStream,
},
{
"X-API-KEY": apiKey,
}
);
也尝试使用form-data
const formData = new FormData();
formData.append(
"operations",
JSON.stringify({ query: print(UPLOAD), variables: { file: null } })
);
formData.append(
"map",
JSON.stringify({
"0": ["variables.file"],
})
);
const file = await streamToString(fileStream);
formData.append("0", file, "image.png");
console.log(formData.getHeaders());
return axios.post(GRAPHQL_URL, formData, {
headers: {
...formData.getHeaders(),
},
});
有什么想法吗?在客户端它使用 File 对象,不知道如何在 Node.JS 客户端上模拟它
【问题讨论】:
-
呵呵我放弃了使用gql进行文件上传,遇到了完全不同的问题,所以最后我只得到了简单的http多部分请求。
-
原来我只需要删除
utf8编码,因为它是二进制图像:)
标签: node.js file-upload graphql nestjs apollo