{"id":16367563,"url":"https://github.com/nkonev/multipart-spring-graphql","last_synced_at":"2025-03-21T01:31:05.347Z","repository":{"id":177947339,"uuid":"659937231","full_name":"nkonev/multipart-spring-graphql","owner":"nkonev","description":"Multipart support for Spring GraphQL","archived":false,"fork":false,"pushed_at":"2024-07-27T03:39:49.000Z","size":169,"stargazers_count":14,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-12T02:50:28.065Z","etag":null,"topics":["graphql","multipart","multipart-uploads","spring","spring-boot","spring-graphql","springboot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nkonev.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-28T22:32:39.000Z","updated_at":"2024-08-15T14:46:46.000Z","dependencies_parsed_at":null,"dependency_job_id":"8326d871-e099-4548-a261-ee0cc9823962","html_url":"https://github.com/nkonev/multipart-spring-graphql","commit_stats":null,"previous_names":["nkonev/multipart-spring-graphql"],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nkonev%2Fmultipart-spring-graphql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nkonev%2Fmultipart-spring-graphql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nkonev%2Fmultipart-spring-graphql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nkonev%2Fmultipart-spring-graphql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nkonev","download_url":"https://codeload.github.com/nkonev/multipart-spring-graphql/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221810743,"owners_count":16884184,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["graphql","multipart","multipart-uploads","spring","spring-boot","spring-graphql","springboot"],"created_at":"2024-10-11T02:50:15.389Z","updated_at":"2025-03-21T01:31:05.334Z","avatar_url":"https://github.com/nkonev.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Multipart Spring GraphQL\n[![Maven Central](https://img.shields.io/maven-central/v/name.nkonev.multipart-spring-graphql/multipart-spring-graphql)](https://central.sonatype.com/namespace/name.nkonev.multipart-spring-graphql)\n\nAdds [missing](https://github.com/spring-projects/spring-graphql/issues/69) multipart support.\n\nBefore using you need to see\n* This [comment](https://github.com/spring-projects/spring-graphql/pull/430#issuecomment-1476186878)\n* This [explanation](https://www.apollographql.com/blog/backend/file-uploads/file-upload-best-practices/)\n\n## Features\n1. `FilePart` arguments  for `Webflux` reactive [stack](https://github.com/nkonev/multipart-graphql-demo/tree/master/server-webflux)\n```java\n@Controller\npublic class FileController {\n\n    private static final Logger logger = LoggerFactory.getLogger(FileController.class);\n\n    @MutationMapping(name = \"fileUpload\")\n    public FileUploadResult uploadFile(@Argument FilePart file) {\n        logger.info(\"Upload file: name={}\", file.filename());\n\n        return new FileUploadResult(UUID.randomUUID());\n    }\n\n    @MutationMapping(name = \"multiFileUpload\")\n    public Collection\u003cFileUploadResult\u003e uploadMultiFiles(@Argument Collection\u003cFilePart\u003e files) {\n        for (FilePart filePart : files) {\n            logger.info(\"Upload file: name={}\", filePart.filename());\n        }\n        return List.of(new FileUploadResult(UUID.randomUUID()));\n    }\n\n}\n```\n\n2. `MultipartFile` arguments for `WebMVC` servlet [stack](https://github.com/nkonev/multipart-graphql-demo/tree/master/server-webmvc)\n```java\n@Controller\npublic class FileController {\n\n    private static final Logger logger = LoggerFactory.getLogger(FileController.class);\n\n    @MutationMapping(name = \"fileUpload\")\n    public FileUploadResult uploadFile(@Argument MultipartFile file) {\n        logger.info(\"Upload file: name={}\", file.getOriginalFilename());\n\n        return new FileUploadResult(UUID.randomUUID());\n    }\n\n    @MutationMapping(name = \"multiFileUpload\")\n    public Collection\u003cFileUploadResult\u003e uploadMultiFiles(@Argument Collection\u003cMultipartFile\u003e files) {\n        for (MultipartFile file : files) {\n            logger.info(\"Upload file: name={}\", file.getOriginalFilename());\n        }\n        return List.of(new FileUploadResult(UUID.randomUUID()));\n    }\n\n}\n```\n\n3. `WebClient`-based [client](https://github.com/nkonev/multipart-graphql-demo/tree/master/client-webflux)\n```java\n    @Autowired\n    private MultipartGraphQlWebClient httpGraphQlClient;\n\n    @Override\n    public void run(String... args) {\n        var doc = \"\"\"\n                mutation FileNUpload($files: [Upload!]) {\n                    multiFileUpload(files: $files){\n                        id\n                    }\n                }\n                \"\"\";\n        Map\u003cString, Object\u003e fileVariables = singletonMap(\"files\", List.of(\n            new ClassPathResource(\"/foo.txt\"), \n            new ClassPathResource(\"/bar.txt\")\n        ));\n\n        var request = MultipartClientGraphQlRequest.builder()\n            .withDocument(doc)\n            .withFileVariables(fileVariables)\n            .build();\n        var response = httpGraphQlClient.executeFileUpload(\"http://localhost:8899/graphql\", request).block();\n        LOGGER.info(\"Response is {}\", response);\n    }\n```\n\n4. `RestClient`-based [client](https://github.com/nkonev/multipart-graphql-demo/tree/master/client-webmvc)\n```java\n    @Autowired\n    private MultipartGraphQlRestClient httpGraphQlClient;\n    \n    @Override\n    public void run(String... args) {\n        var doc = \"\"\"\n            mutation FileNUpload($files: [Upload!]) {\n                multiFileUpload(files: $files){\n                    id\n                }\n            }\n            \"\"\";\n        Map\u003cString, Object\u003e fileVariables = singletonMap(\"files\", List.of(\n            new ClassPathResource(\"/foo.txt\"), \n            new ClassPathResource(\"/bar.txt\")\n        ));\n        var request = MultipartClientGraphQlRequest.builder()\n            .withDocument(doc)\n            .withFileVariables(fileVariables)\n            .build();\n        var response = httpGraphQlClient.executeFileUpload(\"http://localhost:8889/graphql\", request);\n        LOGGER.info(\"Response is {}\", response);\n    } \n```\n\n## Download\n\n### Spring Boot Starter\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ename.nkonev.multipart-spring-graphql\u003c/groupId\u003e\n  \u003cartifactId\u003emultipart-spring-graphql\u003c/artifactId\u003e\n  \u003cversion\u003eVERSION\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n# Compatibility\n\n| multipart-spring-graphql | Java | Spring Boot       | Example                                                      |\n|--------------------------|------|-------------------|--------------------------------------------------------------|\n| 0.10.x                   | 8+   | Spring Boot 2.7.x | https://github.com/nkonev/multipart-graphql-demo/tree/0.10.x |\n| 1.0.x                    | 17+  | Spring Boot 3.0.x | https://github.com/nkonev/multipart-graphql-demo/tree/1.0.x  |\n| 1.1.x                    | 17+  | Spring Boot 3.1.x | https://github.com/nkonev/multipart-graphql-demo/tree/1.1.x  |\n| 1.2.x                    | 17+  | Spring Boot 3.2.x | https://github.com/nkonev/multipart-graphql-demo/tree/1.2.x  |\n| 1.3.x                    | 17+  | Spring Boot 3.3.x | https://github.com/nkonev/multipart-graphql-demo/tree/1.3.x  |\n| 1.4.x                    | 17+  | Spring Boot 3.3.x | https://github.com/nkonev/multipart-graphql-demo/tree/1.4.x  |\n| 1.5.x                    | 17+  | Spring Boot 3.4.x | https://github.com/nkonev/multipart-graphql-demo/tree/1.5.x  |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnkonev%2Fmultipart-spring-graphql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnkonev%2Fmultipart-spring-graphql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnkonev%2Fmultipart-spring-graphql/lists"}