Extended MultipartEntity неправильно записывает потоки - PullRequest
2 голосов
/ 18 июня 2011

Я хочу реализовать ProgressDialog в моем AndroidHttpClient .Я нашел простую реализацию здесь CountingMultipartEntity .
Дополнительно я добавил поддержку длины контента.Я переопределяю метод addPart.
Загрузка FileBody работает почти нормально.Когда выгрузка содержит один файл, он работает отлично, но когда есть два файла, второй файл загружается только частично.
InputStreamBody работает, но только когда я не считаю длину InputStream .Поэтому я должен сбросить его, но как?

Здесь мое переопределение addPart:

@Override
public void addPart(String name, ContentBody cb) {
    if (cb instanceof FileBody) {
        this.contentLength += ((FileBody) cb).getFile().length();
    } else if (cb instanceof InputStreamBody) {
        try {
            CountingInputStream in =
                new CountingInputStream(((InputStreamBody) cb).getInputStream());
            ObjectInputStream ois = new ObjectInputStream(in);
            ois.readObject();
            this.contentLength += in.getBytesRead();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    super.addPart(name, cb);
}

CountingInputStream является простым расширением InputStream:

public class CountingInputStream extends InputStream {
    private InputStream source;
    private long bytesRead = 0;

    public CountingInputStream(InputStream source) {
        this.source = source;
    }

    public int read() throws IOException {
        int value = source.read();
        bytesRead++;
        return value;
    }

    public long getBytesRead() {
        return bytesRead;
    }
}

Подсчет работает почти, есть только 2 байта, которых там быть не должно.Но это так важно.

Сначала я подумал, что поток должен быть сброшен.Сброс, вызванный после in.getReadedBytes();, приводит к IOException .

Спасибо за любые советы.

1 Ответ

1 голос
/ 20 июня 2011

Я нашел свою ошибку.Я переписал метод getContentLength(), который важен для передачи, после удаления моей собственной версии передача файла работает нормально.

Чтобы получить размер InputStream Я использовал вышеприведенный класс, но отредактировал метод getBytesRead(), потому что ObjectInputStream вызывает StreamCorruptedException :

public long getBytesRead() {
    try {
        while (read() != -1)
            ;
    } catch (IOException e) {
        e.printStackTrace();
    }

    return bytesRead;
}

Чтобы получить длину контента, вы можете воспользоваться указанным методом getContentLength(), если потоков нет.
В противном случае вам придется реализовать собственное вычисление длины контента.Метод addPart(String name, ContentBody cb) выше обеспечивает подход.Подробнее о расчете длины контента вы можете узнать из классов MultiPartyEntity и HttpMultipart .

...