Wop*_*ppi 3 file-upload node.js apollo-server
当我上传文件时,服务器返回一个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' } }
Run Code Online (Sandbox Code Playgroud)
这是对我有用的代码。我正在使用 Apollo Server 和 Graphql,“singleUpload”是我为上传图像而创建的解析器。
const path = require("path");
const { createWriteStream } = require("fs");
Run Code Online (Sandbox Code Playgroud)
这两个导入都已包含在节点包中,因此您无需单独安装它们。
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;
}
}
};
Run Code Online (Sandbox Code Playgroud)
“文件”是我从<input type="file"/>. 前端的 apollo-upload-client 自动将流存储在“createReadStream()”中,我可以从传入的文件承诺中对其进行解构。然后,我使用“createWriteStream”管道该流并将其存储在我在服务器上指定的路径中。createWriteStream 函数中的路径相对于您的当前目录,服务器将在运行时查找此文件夹,因此请确保它存在。
最后一件事,如果您直接从服务器向前端提供这些图像,请确保在您的主 index.js 服务器文件中包含以下行。
app.use("/images", express.static(path.join(__dirname, "./uploads/images")));
Run Code Online (Sandbox Code Playgroud)
关于这个问题我得到了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 }))
);
}
Run Code Online (Sandbox Code Playgroud)
来源: https: //github.com/jaydenseric/apollo-upload-examples/blob/master/api/resolvers.mjs#L18