Apache Camel Restlet - Невозможно извлечь данные из нескольких частей - PullRequest
0 голосов
/ 16 марта 2019

Я должен использовать Apache Camel (2.12.4) Restlet для получения загрузки файла из браузера и обработки. Поскольку мое решение не работает, для упрощения, на данный момент я сохранил определение маршрута очень простым, например,

from("restlet:/upload?restletMethod=POST")
.to("file:///<path.to.dir>//?fileName=<dump-file.http>");

Используя Почтальон, я загружаю простой файл класса java и значение формы с целью вернуть их обоих обратно. Я хочу иметь возможность записать файл класса обратно в файл и выполнить, чтобы доказать успешное создание.

Для этого я написал простую утилиту, которая читает файл дампа, используя org.apache.commons.fileupload.MultipartStream; а пока что печатает заголовки и тело.

public class MultipartDataExtractor {

    public static final String DELIMITER = "\\r?\\n";

    public static void main(String[] args) throws Exception {
        byte[] boundary = "----------------------------002984755777142240671505".getBytes(); // copying from dump file
        FileInputStream fis = new FileInputStream(new File("<path.to.dir>/<dump-file.http>"));
        parseMultipartStream(fis, boundary);
    }

    public static void parseMultipartStream(InputStream is, byte[] boundary) throws Exception {
        MultipartStream multipartStream = new MultipartStream(is, boundary, 1024 * 4, null);
        System.out.println("Trying to read multipart data");
        boolean nextPart = multipartStream.skipPreamble();
        while (nextPart) {
            String headers = multipartStream.readHeaders();
            System.out.println(String.format("headers: [%s]", headers));
            multipartStream.readBodyData(System.out);
            System.out.println("");
            nextPart = multipartStream.readBoundary();
        }
    }
}

Я успешно использую этот инструмент для файла, который я создал, извлекая контент из сервлета. На верблюжьем дамп-файле он запускается, однако не в состоянии разобрать, даже если содержимое явно выглядит нормально. MultipartStream.skipPreamble () возвращает false, при отладке, которую я обнаружил, внутренне он выдает исключение MalformedException и возвращает false из блока catch. Сброшенный файл выглядит так

----------------------------002984755777142240671505
Content-Disposition: form-data; name="file"; filename="HelloWorld.class"
Content-Type: application/java-vm

����4

<init>()VCodeLineNumberTablemain([Ljava/lang/String;)V
SourceFileHelloWorld.javaHello World
HelloWorldjava/lang/Objectjava/lang/SystemoutLjava/io/PrintStream;java/io/PrintStreamprintln(Ljava/lang/String;)V   *��
        %   ���



----------------------------002984755777142240671505
Content-Disposition: form-data; name="name"

Hans Muster
----------------------------002984755777142240671505--

Я не уверен, что происходит не так. Любой указатель или помощь будут высоко оценены.

...