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

时间:2018-06-28 11:36:15

标签: node.js file-upload apollo-server

当我上传文件时,服务器将返回streamfilenamemimetypeencoding。我不知道如何将流另存为服务器中的文件。我尝试过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' } }

2 个答案:

答案 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