【问题标题】:Uploading file from Node.JS SDK to GraphQL using graphql-upload使用 graphql-upload 将文件从 Node.JS SDK 上传到 GraphQL
【发布时间】:2021-10-19 23:36:31
【问题描述】:

我正在寻找将文件上传到将文件流式传输到输出的 graphql 端点。 在 graphql 服务器上,它看起来像 apollo 的基本示例。

async uploadFile(
    @Args({ name: 'file', type: () => GraphQLUpload }) file,
    @CurrentUser() user,
  ): Promise<string> {
    const { createReadStream, filename } = await file;

    // for uploading temporary nfts
    const randomFileName = generateRandomFileName(filename);

    const readStream = createReadStream();
    const out = fs.createWriteStream(path.join(__dirname, randomFileName));
    readStream.pipe(out);

    await finished(out);
}

使用graphqlUploadExpress 中间件

graphqlUploadExpress({ maxFileSize: 1024 * 1024 * 100, maxFiles: 1 })

使用 React.JS 上传时,一切正常。但是,当使用 Node.JS 客户端时,它无法上传。图像大小翻倍,未设置 mimetype,图像不可见。

我尝试了不同的方法,但我认为这与通过的读取流有关。

    const fileStream = await fs.createReadStream(
        path.join(__dirname, "image.png"),
        {
          encoding: "utf8",
        }
      );
    
      const response = await request(
        GRAPHQL_URL,
        UPLOAD,
        {
          file: fileStream,
        },
        {
          "X-API-KEY": apiKey,
        }
      );

也尝试使用form-data

  const formData = new FormData();
  formData.append(
    "operations",
    JSON.stringify({ query: print(UPLOAD), variables: { file: null } })
  );
  formData.append(
    "map",
    JSON.stringify({
      "0": ["variables.file"],
    })
  );

  const file = await streamToString(fileStream);

  formData.append("0", file, "image.png");

  console.log(formData.getHeaders());

  return axios.post(GRAPHQL_URL, formData, {
    headers: {
      ...formData.getHeaders(),
    },
});

有什么想法吗?在客户端它使用 File 对象,不知道如何在 Node.JS 客户端上模拟它

【问题讨论】:

  • 呵呵我放弃了使用gql进行文件上传,遇到了完全不同的问题,所以最后我只得到了简单的http多部分请求。
  • 原来我只需要删除utf8 编码,因为它是二进制图像:)

标签: node.js file-upload graphql nestjs apollo


【解决方案1】:

原来我只需要删除utf8 编码。以下示例作品

const fileStream = await fs.createReadStream(
    path.join(__dirname, "image.png")
  );

  const response = await request(
    GRAPHQL_URL,
    UPLOAD,
    {
      file: fileStream,
    },
    {
      "X-API-KEY": apiKey,
    }
  );

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2020-12-04
    • 2021-07-12
    • 2021-03-19
    相关资源
    最近更新 更多