扩展的MultipartEntity不能正确写出Streams

时间:2011-06-17 20:55:16

标签: java android inputstream multipart

我想在 AndroidHttpClient 中实现 ProgressDialog 。我在这里找到了一个简单的实现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 个答案:

答案 0 :(得分:1)

我发现了自己的错误。我已经覆盖了方法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)提供了一种方法。有关内容长度计算的更多详细信息,您可以从课程MultiPartyEntityHttpMultipart获得。