Проблемы с получением образца Netty "HttpUploadServer" для чтения данных HTTP PUT, отлично работает с HTTP POST - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь получить образец Netty HttpUploadServer для получения загруженного файла через HTTP PUT, код найден здесь: https://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/http/upload/HttpUploadServerHandler.java

Чтобы проверить загрузку файла HTTP POST, я использую эту команду curl:

curl -F "myfile=@testfile.txt" http://127.0.0.1:8080

Чтобы проверить загрузку файла HTTP PUT, я использую команду curl:

curl -T "testfile.txt" http://127.0.0.1:8080

Я закомментировал writeMenu и возвращаюсь, поскольку использую curl, а не веб-браузер.При использовании curl to POST все работает нормально, однако с PUT я не получаю никаких данных в readHttpDataAllRecieve (HttpUploadServerhandler):

private void readHttpDataAllReceive(Channel channel) {
    List<InterfaceHttpData> datas = null;
    try {
        datas = decoder.getBodyHttpDatas();
        System.out.println("size " + datas.size());
    } catch (NotEnoughDataDecoderException e1) {
        // Should not be!
        e1.printStackTrace();
        responseContent.append(e1.getMessage());
        writeResponse(channel);
        Channels.close(channel);
        return;
    }
    for (InterfaceHttpData data: datas) {
        writeHttpData(data);
    }
    responseContent.append("\r\n\r\nEND OF CONTENT AT FINAL END\r\n");
}

datas = decoder.getBodyHttpDatas ();Данные всегда имеют размер 0 с PUT, но не с POST.

Спасибо за любые идеи

1 Ответ

2 голосов
/ 15 марта 2012

Я не эксперт CURL, но, может быть, CURL просто отправляет файл "как есть", когда вы PUT, а не как MIME из нескольких частей, когда вы POST.

Тип содержимого для PUT обычно является типом файла; например текст / XML. Для сообщения это multipart/form-data

HttpPostRequestDecoder чтение и декодирование MIME из нескольких частей. Смотрите комментарии на https://github.com/netty/netty/blob/master/codec-http/src/main/java/io/netty/handler/codec/http/HttpPostRequestDecoder.java#L187

Конечным результатом является то, что для PUT from CURL проверьте, можете ли вы изменить тип содержимого на multi-part/formdata. Однако это неэффективно из-за кодирования MIME.

Я думаю, что лучшим вариантом будет просто обработать загруженные данные. По сути, когда вы получаете первоначальный HTTP-запрос, откройте файл. Получив каждый кусок, запишите его в файл. На последнем чанке закройте файл.

Я кое-что написал некоторое время назад. Смотри https://github.com/chililog/chililog-server/blob/master/src/main/java/org/chililog/server/workbench/ApiRequestHandler.java#L133

Надеюсь, это поможет.

...