当我上传文件时,服务器将返回stream
,filename
,mimetype
,encoding
。我不知道如何将流另存为服务器中的文件。我尝试过fs.createReadStream
,只是想不出下一步如何将其放入./uploads
文件夹中?
{ stream:
FileStream {
_readableState: [Object],
readable: true,
domain: null,
_events: [Object],
_eventsCount: 2,
_maxListeners: undefined,
truncated: false,
_read: [Function] },
filename: 'test-sample.xlsx',
mimetype: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
encoding: '7bit' } }
答案 0 :(得分:3)
这是对我有用的代码。我正在使用Apollo Server和Graphql,“ singleUpload”是我为上传图像而创建的解析器。
const path = require("path");
const { createWriteStream } = require("fs");
这两种导入都已经包含在节点软件包中,因此您无需单独安装它们。
singleUpload: async (_, { file }) => {
const { createReadStream, filename, mimetype, encoding } = await file;
await new Promise((res) =>
createReadStream()
.pipe(
createWriteStream(
path.join(__dirname, "../../uploads/images", filename)
)
)
.on("close", res)
);
return true;
}
}
};
“文件”是我从<input type="file"/>
转发来的图像文件。前端的apollo-upload-client自动将流存储在“ createReadStream()”中,我可以将其解构成传入文件promise。然后,我使用'createWriteStream'通过管道传输该流,并将其存储在我在服务器上指定的路径中。 createWriteStream函数中的路径是相对于您当前目录的,并且服务器将在运行时查找此文件夹,因此请确保它存在。
最后一件事,如果您是直接从服务器将这些图像提供给前端,请确保在主index.js服务器文件中包含以下行。
app.use("/images", express.static(path.join(__dirname, "./uploads/images")));
答案 1 :(得分:2)
apollo-upload-server
作者在此问题上为我提供了帮助。万一有人遇到此问题,以下是将流保存到文件的方法:
const storeFS = ({ stream, filename }) => {
const uploadDir = './uploads';
const path = `${uploadDir}/${filename}`;
return new Promise((resolve, reject) =>
stream
.on('error', error => {
if (stream.truncated)
// delete the truncated file
fs.unlinkSync(path);
reject(error);
})
.pipe(fs.createWriteStream(path))
.on('error', error => reject(error))
.on('finish', () => resolve({ path }))
);
}
来源:https://github.com/jaydenseric/apollo-upload-examples/blob/master/api/resolvers.mjs#L18