Загрузить файл без формы - Spring REST API - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть клиент Java, который получает InputStream и должен загрузить файл из этого InputStream, используя ресурс REST API.

Я попытался сделать следующее:

FileBody uploadFilePart = new FileBody(new File(filePath)); //filePath was extracted from the INPUTStream
//      MultipartEntity reqEntity = new MultipartEntity();
//      reqEntity.addPart("file", uploadFilePart);


    Invocation.Builder builder = baseTarget.path(apiPath + "importProject")
            .queryParam("file", uploadFilePart)
            .queryParam("name", name)
            .queryParam("filePath", filePath)
            .queryParam("overwrite", overwrite)
            .request(/*MediaType.APPLICATION_JSON*/);

    Response response = builder.post(Entity.json(null));

или:

MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
    //builder.addTextBody("field1", "yes", ContentType.TEXT_PLAIN);

    // This attaches the file to the POST:
    File f = new File(filePath);
    entityBuilder.addBinaryBody(
        "file",
        new FileInputStream(f),
        ContentType.APPLICATION_OCTET_STREAM,
        f.getName()
    );

    HttpEntity multipart = entityBuilder.build();
    //uploadFile.setEntity(multipart);

    Invocation.Builder builder = baseTarget.path(apiPath + "importProject")
            .queryParam("file", multipart)
            .queryParam("name", name)
            .queryParam("filePath", filePath)
            .queryParam("overwrite", overwrite)
            .request(/*MediaType.APPLICATION_JSON*/);

    Response response = builder.post(Entity.json(null));

или:

final FileDataBodyPart filePart = new FileDataBodyPart("file", new File(filePath));
    FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
    final FormDataMultiPart multipart = (FormDataMultiPart) formDataMultiPart.field("name", "value").bodyPart(filePart);

    Invocation.Builder builder = baseTarget.path(apiPath + "importProject")
            .queryParam("file", multipart)
            .queryParam("name", name)
            .queryParam("filePath", filePath)
            .queryParam("overwrite", overwrite)
            .request(MediaType.MULTIPART_FORM_DATA);

    Response response = builder.post(/*Entity.entity(multipart, multipart.getMediaType())*/ Entity.json(null));

    formDataMultiPart.close();
    multipart.close();

и в контроллере:

@RequestMapping(method=RequestMethod.POST, value="importProject", headers = "content-type=multipart/*")
public ResponseEntity<Void> importProject(@RequestParam("file") MultipartFile file,
        @RequestParam(value="name", required = true) String name, 
        @RequestParam(value="filePath", required = true) String filePath, 
        @RequestParam(value="overwrite", required = false) boolean overwrite,
        @RequestParam(value="userSessionId", required = false) String userSessionId)
                throws ProjectManagementException, IOException {

Но я получаю следующее:

Серверотклонил этот запрос, потому что объект запроса находится в формате, который не поддерживается запрошенным ресурсом для запрошенного метода

У меня нет формы для просмотра и выбора файла.Как я могу смоделировать FormData и отправить его на отдых в этом случае?

1 Ответ

0 голосов
/ 18 февраля 2019

Мне потребовалось некоторое время, чтобы найти примеры кода Jersy Java: https://www.programcreek.com/java-api-examples/?api=org.glassfish.jersey.media.multipart.MultiPart

Клиент:

final FileDataBodyPart filePart = new FileDataBodyPart("file", new File(filePath));

    MultiPart multipart = new FormDataMultiPart()
            .field("foo", "bar")
            .bodyPart(filePart);

    Invocation.Builder builder = baseTarget.path(apiPath + "importProject")
            .register(MultiPartFeature.class)
            //.queryParam("file", multipart)
            .queryParam("name", name)
            .queryParam("filePath", filePath)
            .queryParam("overwrite", overwrite)
            .request(MediaType.MULTIPART_FORM_DATA);

    Response response = builder.post(Entity.entity(multipart, multipart.getMediaType()) ); //new MediaType("application", "utf-8")

Остальное:

@RequestMapping(method=RequestMethod.POST, value="importProject", headers = "content-type=multipart/*")
public ResponseEntity<Void> importProject(/*@RequestParam("file")*/ @RequestBody MultipartFile file,
        @RequestParam(value="name", required = true) String name, 
        @RequestParam(value="filePath", required = true) String filePath, 
        @RequestParam(value="overwrite", required = false) boolean overwrite,
        @RequestParam(value="userSessionId", required = false) String userSessionId)
                throws ProjectManagementException, IOException {
...