私は私が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を印刷することができます期待しています。
私たちのスキーマ内のスカラ型を定義します
scalar Upload
そして、我々はアップロードのためのGraphQLScalarTypeを設定する必要があり、これについては、以下を使用します。
@Configuration
パブリッククラスGraphqlConfig {
@Bean public GraphQLScalarType uploadScalarDefine() { return ApolloScalars.Upload; }
}
その後、我々は、スキーマ内の突然変異と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; } }
- 用ジャクソンデシリアライザを設定
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;
}
- 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
このような:
フォーム・データのオプションを選択することを忘れないでください
これを通じて、私たちは複数のファイルをアップロードすることができます