NodeJS:获取文件,而不是缓冲区

时间:2018-11-26 12:58:49

标签: node.js graphql fs apollo

我已经在apollo GraphQL服务器上使用graphql-upload (或apollo-upload-server设置了一个变种,以从客户端接收文件,现在我我正在尝试为此突变编写测试,但我不确定如何将实际文件附加到模拟请求中。

在我的客户端上,我有一个input type="file",在上载事件中,我提取了文件

async upload(event) {
  const files = event.target.files || event.dataTransfer.files;
  const file = files[0]; // type of file is File
  await apollo.mutate({
    mutation: gql`
      mutation UploadFile($file: Upload) {
        uploadFile(file: $file)
      }
    `,
    variables: { file },
  })
}

到目前为止,一切都很好。但是我也想在服务器上编写一个测试用例。

这是我的问题

在我的服务器上,我想模仿客户端上传文件。但是我找不到如何从NodeJS中访问实际文件的方法。

我尝试过:

const file = fs.readFileSync('path/to/test-file.csv');

但是fs返回一个Buffer,不是File类型,它也包含元数据,例如mimetypename,{{1} }属性。

如何获取实际的lastModified 对象而不是File

谢谢!

3 个答案:

答案 0 :(得分:2)

Node.js中没有File类。而且,在假设存在该平台的类的对象中,没有任何东西可以组合MIME类型,文件内容和文件名。您将必须使用不同的方法来获取所需的所有信息。

  1. fs.readFileSync可以从文件描述符或文件路径获取文件的内容
  2. fs.lstatSyncfs.fstatSync [与readFileSync一样[同步地]为您提供了一些您想要的属性,尤其是文件的“最后修改的时间戳”。

没有绝对可接受的方法来获取文件的MIME类型-尽管某些类型的数据的某些MIME类型已标准化,但通常会对内容进行启发式分析以确定文件的MIME类型。例如,对于同样也是有效XML文件的SVG文件(通常为*.svg),您需要确保该文件可解析为XML,从而确定根“ svg”元素属于通过将声明的名称空间URI与已知的SVG元素名称空间进行比较,将其添加到SVG名称空间,然后可以断言该文件为image/svg+xml MIME类型。这种方法-对实际文件内容进行一些分析-如果需要确定的话,将适用于任何确定MIME类型的情况。

现在,大多数Web服务器仅将文件的扩展名用作MIME类型映射的键-例如,据说所有*.gif文件都是image/gif MIME类型,即使存在垃圾或纯文字。这是因为Web服务器和客户端通常都不需要进行启发式分析-如果假定是GIF的文件实际上是垃圾,则客户端将中止渲染或渲染垃圾,但是确保文件内容有效的责任在于拥有文件的人,而不是拥有Web服务器的人,并且Web服务器无论如何都不关心内容,它仅提供服务的内容,解析它通常不是真正的责任(不是“资产”文件)。但是,真正的原因当然是性能-鉴于启发式分析通常比仅基于文件扩展名确定MIME类型更为昂贵,因此后者是首选。

答案 1 :(得分:0)

简单:

const file = fs.readFileSync('path/to/test-files.csv').toString();

希望它会有所帮助:-)

答案 2 :(得分:0)

您可以将编码设置为utf-8。

fs.readFile(path.resolve(path), { encoding: 'utf-8', flag: 'r' }, (error, data) => {

})