graphql-Javaにファイルをアップロードするには?

EAユービーアイソフト:

私は私がgraphql-javaの使用する場合、缶誰かが私にデモを表示し、ファイルをアップロードする方法を見つけることができませんか?私は理解されるであろう!

参照:https://github.com/graphql-java-kickstart/graphql-java-tools/issues/240

私はgraphql-javaの - キックスタートgraphql-javaの-ツールを使用してspringbootでそれを試みたが、それはうまくいきませんでした

@Component
public class FilesUpload implements GraphQLMutationResolver {

    public Boolean testMultiFilesUpload(List<Part> parts, DataFetchingEnvironment env) {
        // get file parts from DataFetchingEnvironment, the parts parameter is not used
        List<Part> attchmentParts = env.getArgument("files");
        System.out.println(attchmentParts);
        return true;
    }
}

これは私のスキーマです

type Mutation {
    testSingleFileUpload(file: Upload): UploadResult
}

私は、私は、ファイルの一部を取得することができますので、このリゾルバは、attchmentPartsを印刷することができます期待しています。

EAユービーアイソフト:
  1. 私たちのスキーマ内のスカラ型を定義します

    scalar Upload

    そして、我々はアップロードのためのGraphQLScalarTypeを設定する必要があり、これについては、以下を使用します。

    @Configuration

    パブリッククラスGraphqlConfig {

    @Bean
    public GraphQLScalarType uploadScalarDefine() {
        return ApolloScalars.Upload;
    }
    

    }

  2. その後、我々は、スキーマ内の突然変異とtestMultiFilesUploadためGraphQLMutationResolverを定義します

    type Mutation {
        testMultiFilesUpload(files: [Upload!]!): Boolean
    }
    

ここでのリゾルバは次のとおりです。

  public Boolean testMultiFilesUpload(List<Part> parts, DataFetchingEnvironment env) {
        // get file parts from DataFetchingEnvironment, the parts parameter is not use
        List<Part> attachmentParts = env.getArgument("files");
        int i = 1;
        for (Part part : attachmentParts) {
            String uploadName = "copy" + i;
            try {
                part.write("your path:" + uploadName);
            } catch (IOException e) {
                e.printStackTrace();
            }
            i++;
        }
        return true;

    }
}
  1. 用ジャクソンデシリアライザを設定javax.servlet.http.Partし、ObjectMapperに登録

パブリッククラスPartDeserializerはJsonDeserializerを{延び

    @Override
    public Part deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {

        return null;
    }


}

なぜ我々はNULLを返しますか?のでList<Part> parts、常にnullで、リゾルバの方法では、DataFetchingEnvironmentからの部品の引数を取得します。

environment.getArgument( "ファイル")

ObjectMapperにそれを登録します。

 @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Part.class, new PartDeserializer());
        objectMapper.registerModule(module);
        return objectMapper;
    }
  1. GraphQLエンドポイントに(私たちはポストマンを使用)、これをテストする以下のフォームデータを投稿します
operations

{ "query": "mutation($files: [Upload!]!) {testMultiFilesUpload(files:$files)}", "variables": {"files": [null,null] } }

map

{ "file0": ["variables.files.0"] , "file1":["variables.files.1"]}

file0

your file

file1

your file

このような:

フォーム・データのオプションを選択することを忘れないでください ここでは、画像の説明を入力します。

これを通じて、私たちは複数のファイルをアップロードすることができます

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229309&siteId=1