Camel Rest DSL восстанавливает файл HTTP POST, состоящий из нескольких частей - PullRequest
0 голосов
/ 14 января 2019

Мой класс маршрутизатора выглядит следующим образом, и я пытаюсь загрузить видеофайл и сохранить его в папке «Файл».

SpringBootRouter.java

package com.camelrest;

import java.util.HashMap;
import java.util.Map;

import org.apache.camel.component.restlet.RestletComponent;
import org.apache.camel.spring.boot.FatJarRouter;
import org.restlet.Component;
import org.restlet.ext.spring.SpringServerServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class MySpringBootRouter extends FatJarRouter {

    @Autowired
    private MultipartProcessor multipartProcessor;

    @Override
    public void configure() {

        restConfiguration().component("restlet");

        rest("/upload").post().to("direct:upload");

        from("direct:upload")
        .to("file://E:/RestTest");

    }

    @Bean
    public ServletRegistrationBean servletRegistrationBean() {

        SpringServerServlet serverServlet = new SpringServerServlet();
        ServletRegistrationBean regBean = new ServletRegistrationBean(
                serverServlet, "/rest/*");

        Map<String, String> params = new HashMap<String, String>();

        params.put("org.restlet.component", "restletComponent");

        regBean.setInitParameters(params);

        return regBean;
    }

    @Bean
    public Component restletComponent() {
        return new Component();
    }

    @Bean
    public RestletComponent restletComponentService() {
        return new RestletComponent(restletComponent());
    }    
}

Я пытаюсь загрузить видеофайл с помощью почтальона, как показано на скриншоте ниже:

enter image description here

Мое содержимое файла, который я загружаю, сохраняется с именем файла с некоторым случайным идентификатором верблюда, сгенерированным верблюдом

enter image description here

Однако я хочу имя файла, которое передается в теле

SampleVideo_1280x720_10mb.mp4

, чтобы быть именем файла и удалить следующее содержимое из тела

----------------------------948281627232093197119960
Content-Disposition: form-data; name="file"; filename="SampleVideo_1280x720_10mb.mp4"
Content-Type: video/mp4

Таким образом, окончательным результатом может быть видео, загруженное с именем файла, использованным при загрузке с почтальоном

1 Ответ

0 голосов
/ 16 января 2019

Вы можете использовать MimeMultipartDataFormat для отмены маршалинга многочастного запроса. Используя это, подготовит вложения к Exchange.

После этого вам нужно каким-то образом преобразовать Attachment в InputStream и заполнить заголовок CamelFileName. С этой задачей вам может помочь маленький Processor.

Маршрут:

from("direct:upload")
        .unmarshal().mimeMultipart().split().attachments()
        .process(new PrepareFileFromAttachment())
        .to("file://C:/RestTest");

Процессор:

class PrepareFileFromAttachment implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        DataHandler dataHandler = exchange.getIn().getBody(Attachment.class).getDataHandler();
        exchange.getIn().setHeader(Exchange.FILE_NAME, dataHandler.getName());
        exchange.getIn().setBody(dataHandler.getInputStream());
    }
}

Подход, описанный выше, не работает, если ваша форма содержит только один вход в форму. Это связано с тем, что MimeMultipartDataFormat маршалы сначала формируют входные данные в тело (без сохранения имени файла) и другие входные данные для вложений, в которых хранится имя файла. В этом случае вам нужно создать Processor чтение InputStream напрямую:

Маршрут:

from("direct:upload")
        .process(new ProcessMultipartRequest())
        .to("file:c://RestTest");

Процессор

public class ProcessMultipartRequest implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        InputStream is = exchange.getIn().getBody(InputStream.class);
        MimeBodyPart mimeMessage = new MimeBodyPart(is);
        DataHandler dh = mimeMessage.getDataHandler();
        exchange.getIn().setBody(dh.getInputStream());
        exchange.getIn().setHeader(Exchange.FILE_NAME, dh.getName());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...