如何将文件流另存为节点中文件夹中的文件

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)

Sam*_*ale 7

这是对我有用的代码。我正在使用 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)


Wop*_*ppi 5

关于这个问题我得到了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