我正在使用graphql-upload将文件从Web客户端上载到apollo Express服务器到另一台服务器,这需要PUT
要求提供avatarImage
的文件。
文件正确进入了uploadLogo()。我可以从快递服务器保存并查看它。当我传递文件流时 到PUT / avatar,该端点不会收到它。我已经测试了从文件系统直接将文件发送到/ avatar并可以确认端点正常工作。
这是我的数据源文件,我在其中将文件的createReadStream附加到表单数据中并将其发送到访存位置。
class MyAPI extends RESTDataSource {
async uploadLogo(id, file) {
const { createReadStream, filename, mimetype } = await file;
const stream = createReadStream();
const formData = new FormData();
formData.append('avatarImage', stream, {
contentType: mimetype,
filename
});
const headers = formData.getHeaders();
return this.put('http://localhost:5000/avatar', formData, {headers});
}
}
将表单数据流发送到此/ avatar端点时我缺少什么?
答案 0 :(得分:0)
我也面临这个问题,不确定是否是解决该问题的正确方法。无法找到要使用graphql-server-express
从graphql-upload
上传到另一服务的任何引用/文档。 (spectrum question for reference)
实际上,我必须将文件作为临时文件写入文件系统,并通过文件系统读取流以形成数据,以使其正常工作。如果没有临时文件,则报头不正确,并且在上游看来,内容长度为1
或0
或某个奇怪的值。
这就是我所做的:
// this is a method on our data-source-rest
async uploadSomeFile({ invoices }: { invoices: Promise<FileUpload> }) {
const { createReadStream: apolloFileStream, mimetype, filename } = await invoices;
const tempFilename = `/tmp/${Date.now()}/${filename}`;
const stream = apolloFileStream();
const wstream = createWriteStream(tempFilename);
await new Promise((resolve, reject) => {
stream
.pipe(wstream)
.on('finish', () => resolve())
.on('error', () => reject());
});
const rstream = createReadStream(tempFilename);
const data = new FormData();
data.append('file', rstream);
return this.post(`/transactions/upload`, data);
}