Файл в формате XMLDataBodyPart не загружается через ApacheHttpClient в CherryPy

Пожалуйста, извините мой, вероятно, неточный словарный запас. Я использую ApacheHttpClient через Джерси для отправки файла на наш сервер Berkeley DBXML, который обрабатывается CherryPy.

Передача отправляется через Chunked, а не потоковую кодировку - потому что мы добавили ProgressBar. Файлы отправляются с использованием графического интерфейса, где вы указываете адрес сервера, файл, и следует ли перезаписать. Файлы могут быть в формате XML или XLS/X.

Проблема, с которой я сталкиваюсь, заключается в том, что при отправке XML и выборе опции "перезаписать" CherryPy получает только "dict: {"overwrite","1"}" в параметрах запроса и утверждает, что поле "data" - который должен содержать фактический файл XML - пуст.

На стороне Java, если я вытащу BodyPartsиз FormDataЯ вижу, что у него есть файл и команда перезаписи. Только команда перезаписи делает это Cherrypy.

Теперь, отменив выбор перезаписи, данные отправляются, но, очевидно, не будут перезаписаны в этот момент.

Странно то, что это относится ТОЛЬКО к XML-файлам. XLS / X-файлы можно отправлять и отправлять повторно с перезаписью. Они обрабатываются точно так же на стороне клиента - и обрабатываются по-разному только при разборе на стороне сервера, но это не так уж далеко.

Функциональность работала нормально, прежде чем мы переключились на кодирование Chunked. Вот выдержки из кода:

Файл добавляется к экземпляру FormDataMultiPart как fileDataBodyPart. Ручки UploadWorker

public void add(File file, boolean overwrite, UploadWorker worker) 
 {
    guilog = worker;  // if non null, output by publishing to worker
    //start filter here, pass in bytes
    long fbytes = file.length();
    String basename = Util.stripExt(file);

    //we recreate filters so that progress is reported properly
    //necessary for folder imports
    client.removeAllFilters();
    client.addFilter(new ConnectionListenerFilter(new ListenerFactory(fbytes,worker.progress,basename)));

    // Build a multipart POST form to be submitted

    // Prepare the metadata file for attachment.
    // We do this before creating the multipart form as we
    // won't have to close it out if there's problems here
    // and we bail.


    FileDataBodyPart bodypart;
    try {
        bodypart = fileDataBodyPart("data", file);
    } catch (Throwable t) {
        bodypart = null;
    }
    if (bodypart == null) {
        return;  // error msg handled as a side effect
    }



    MediaType media = MultiPartMediaTypes.createFormData();
    FormDataMultiPart formdata = new FormDataMultiPart();
    formdata.setMediaType(media);

            //THIS IS SIMPLIFIED EXAMPLE HARDCODED OVERWRITE

    formdata = formdata.field("overwrite", "1");

        //I have also tried
    //FormDataBodyPart bp = new FormDataBodyPart("overwrite","1");
    //formdata.bodyPart(bp);


    formdata.bodyPart(bodypart);  // attach metadata
            WebResource add = resourceCollection.path("add");

    try {
        response = add.type(media)
                .accept(MediaType.APPLICATION_XML,MediaType.TEXT_PLAIN)  //TEXT_PLAIN
                .post(ClientResponse.class, formdata);
        resIn = response.getEntityInputStream();
        responseText = convertStreamToString(resIn);
        status = response.getStatus();

С различными уловами для try, Насколько я могу сказать, сторона JavaClient работает нормально, но как только код сервера получает POST, поле "data" formdata отсутствует, и существует только перезапись! Повторюсь, это относится только к XML, а не к XLS.

Какие-нибудь советы? это какая-то врожденная ошибка или я делаю что-то не так?

Используемая нами CherryPy прямо из коробки - никаких модификаций.

Спасибо! Шон

1 ответ

Решение

Для тех с подобной проблемой... я "решил" это.

Оказывается, размер файла XML был слишком мал (<1 КБ) для обработки с помощью чанкованного кодирования.

Зачем? Без понятия. Но используя большие файлы, я могу перезаписать и отправить их в порядке, со всеми присутствующими формами...

РЕДАКТИРОВАТЬ: размер фрагмента по умолчанию составляет 8192 байта или 8 КБ. Загрузка не будет выполняться последовательно, пока размер файла не будет>= 8 КБ, поэтому я считаю, что apache ожидает загрузки по крайней мере одного фрагмента.

so..whatever. Спасибо за прочтение!

Другие вопросы по тегам