首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Relay和的文件上传

带有Relay和的文件上传
EN

Stack Overflow用户
提问于 2016-11-11 11:34:57
回答 2查看 2.4K关注 0票数 6

我试图在中继器中构建一个包含文件的突变。一旦实现了此处引用的getFiles()方法:https://facebook.github.io/relay/docs/api-reference-relay-mutation.html#getfiles

中继发送多部分请求,导致来自ASP.NET Core的415个错误。

我正在寻找一个类似于graphql-dotnet库的“graphql-dotnet库”的工作示例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-11 18:14:30

GraphQL端点不接受多部分表单mimetype,因为它不是JSON。一旦我通过RootObject和变异中可用的上下文将它们导入graphql,我就能够处理这些文件。让我失望的是MVC。

所以我写了一个简单的过滤器:

代码语言:javascript
复制
public class RelayResourceFilter : IResourceFilter
{
    private readonly string jsonMediaType = "application/json";

    public void OnResourceExecuted(ResourceExecutedContext context)
    {
    }

    public void OnResourceExecuting(ResourceExecutingContext context)
    {


        if (!string.Equals(MediaTypeHeaderValue.Parse(context.HttpContext.Request.ContentType).MediaType,
            this.jsonMediaType, StringComparison.OrdinalIgnoreCase))
        {
            var encoder = JavaScriptEncoder.Create();
            var variables = encoder.Encode(context.HttpContext.Request.Form["variables"]);
            var query = encoder.Encode(context.HttpContext.Request.Form["query"]);
            var body = $"{{\"query\":\"{query}\", \"variables\":\"{variables}\"}}";

            byte[] requestData = Encoding.UTF8.GetBytes(body);
            context.HttpContext.Request.Body = new MemoryStream(requestData);
            context.HttpContext.Request.ContentType = this.jsonMediaType;
        }
    }
}

登记如下:

代码语言:javascript
复制
services.AddScoped<RelayResourceFilter>();

然后在Controller中这样应用:

代码语言:javascript
复制
[ServiceFilter(typeof(RelayResourceFilter))]
    public async Task<ExecutionResult> Post([FromBody]GraphQLQuery query, bool? useErrorCode)
{
var files = this.Request.HasFormContentType ? this.Request.Form.Files : null;
// ... assignment to Root Object
}
票数 4
EN

Stack Overflow用户

发布于 2016-11-11 16:38:28

您只是在弄清楚如何访问服务器上的解析器中的文件时遇到了问题吗?您可以将文件作为您的rootObjectuserContext传递。

代码语言:javascript
复制
// GraphQLController
var files = Request.Form.Files;
var userContext = files;

var result = await executer.ExecuteAsync(
    schema,
    rootObject,
    query,
    operationName,
    inputs,
    userContext).ConfigureAwait(false);

// Mutation type
Field<StringGraphType>(
  "uploadFile",
  arguments: new QueryArguments(new QueryArgument<NonNullGraphType<StringGraphType>> {Name = "fileName"}),
  resolve: context =>
  {
      var userContext = context.UserContext.As<IFormFileCollection>();

      // process files

      // return data
      return "success";
  });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40547164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档