1

因此,我已经研究了两天,对 Java 的了解还不够,无法完全实现解决此问题的方法。在客户端,我找到了一些优秀的用户文档,并相信我有正确的部分,但是在处理服务器中的入站 multipart/formdata 时,我有点迷茫。

我的应用程序的基础是基于HowToGraphQL Java教程,因为我觉得他们在组织代码库方面做得很好,并且使事情变得非常简单易懂。不幸的是,文件上传不是他们涵盖的领域,并且根据 graphql-java 包的维护者,不存在直接支持此功能的计划

然而,这并不是说这是不可能的。GraphQL 规范旨在成为指导方针,社区如何选择调用规范取决于他们。许多人成功地结合了文件上传,尽管通常是通过包含自定义中间件

不幸的是,对我来说,障碍可能只是缺乏领域知识。我主要使用 JavaScript 和 Python 工作,并且主要有 Java 的学术经验。不完全确定从哪里开始,但我想我需要追踪我认为绑定到 SimpleGraphQLServlet 类的响应对象,并找到一种方法来提取入站文件对象。

希望获得更多专家建议或帮助提出解决方案。我还没有在 SO 上找到任何可靠的基于 Java 的片段来解决这个问题,因此解决这个问题可能会使其他尝试采用这个平台的人受益。

编辑:

可能找到了一种方法来做到这一点,但仍然没有制定出具体细节。在扩展 SimpleGraphQLServlet 类的 GraphQLEndpoint 类中,我们公开了 doPost() 方法。然而,提取数据最终会导致一系列错误,第一个错误是通过 @MultipartConfig 注释解决的,但是下一个错误让我再次停滞不前。“缺少 MultiPart 请求的内容。”

这个 doPost() 方法似乎是在发生突变后调用的,所以即使我设法提取了文件数据,似乎数据也会放在错误的位置。此外,我想知道丢失的内容是否是 Mutation 消耗帖子数据的结果,假设它甚至到达了。

然而,所有其他参数都完好无损,因此只需访问此文件即可。

4

2 回答 2

1

可悲的是,HowToGraphQL 上的 Java 教程已经过时了。我正在努力更新它(我是原版的作者),但这需要时间。当前的最佳实践是RuntimeWiring在以模式优先的方式工作时直接使用 graphql-java*。这里有一些基本文档:http: //graphql-java.readthedocs.io/en/v6/schema.html

无论如何,处理文件上传的方式并没有改变:将整个HttpServletRequest对象或二进制部分粘贴到共享上下文中:

graphQL.execute(ExecutionInput.newExecutionInput()
    .query(operation)
    .context(request.getPart("file")) //add the binary to the context
    .build());

稍后,在 中DataFetcher,您可以通过以下方式获取它DataFetchingEnvironment#getContext

Part file = environment.getContext();
file.getInputStream(); //do something with the binary content

当然,您可以使用其他(动态)结构作为上下文,而不是直接使用二进制文件。

这种处理上传的侧载方式是使用 JSON 作为传输格式的结果,而 JSON 是文本的。与通常在 GraphQL 之外处理文件下载的原因相同(其中响应仅包含启动下载所需的 ID 或 URL)。参考服务器实现包括使用相同策略的示例。
目前,据我所知,没有非 JSON GraphQL 客户端。

*对于代码优先,graphql-spqr(我的项目)仍然是最方便的方式。

于 2018-01-19T14:41:49.963 回答
0

目前,不幸的是,对我有用的解决方案并没有完全遵循我认为的最佳实践,使用可上传文件,作为多部分/表单数据发送,然后在服务器上注入中间件。但是我能够传输文件数据,所以这是一个足够好的开始。

最终,我选择将我上传的文件编码为 base64,然后通过 GraphQL 突变将数据作为 String 类型发送,然后在收到后我能够解码 base64 字符串。

现在我看到的只是正在传输的文件内容,而不是元数据。由于某些元数据对我很有价值,因此要么需要与 base64 字符串一起发送,要么我只是忽略了这个元素并且它确实存在。

无论哪种方式,我都会留下一些我在解决这个问题时发现有用的资源,如果其他人遇到这个问题,它可能会很有用。我不认为我当前的解决方案是真正的答案,所以也许随着这些包的发展,我们会看到更好的方法来通过 Relay/graphql-java 上传文件。

如何在 JavaScript 中将文件转换为 base64?

在 Java 中解码 Base64 数据

于 2018-01-18T22:08:57.973 回答