如何监控HttpURLConnection PUT过程

时间:2014-11-19 02:23:02

标签: java http httpurlconnection

我有一个应用程序,可以使用HttpURLConnection将文件上传到云服务:

    HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
    httpCon.setDoOutput(true);
    httpCon.setRequestMethod("PUT");
    OutputStreamWriter out = new OutputStreamWriter(
        httpCon.getOutputStream());

    FileInputStream fis = new FileInputStream("C:/Users/me/Pictures/_MG_9324.JPG");
    IOUtils.copy(fis,httpCon.getOutputStream());
    out.close();
    InputStream is= httpCon.getInputStream();
    IOUtils.copy(is,System.out);

程序在第一个IOUtils.copy没有阻止,而是在第二个IOUtils.copy阻止。我的理解是程序阻止,因为上传没有完成。所以我在上传过程中的问题,如何监控从客户端上传的数据量?

2 个答案:

答案 0 :(得分:1)

在您调用ByteArrayOutputStreamgetInputStream()之前,输出会写入getResponseCode(),以便可以正确设置Content-length标头。所以第二个复制操作包括上传。为避免这种情况,请使用分块传输模式。

答案 1 :(得分:1)

不要将OutputStream包装在OutputStreamWriter中,而是将OutputStream包装在下面的类中。您可以传入一个回调函数,该函数将监听正在写入的字节。

public class CallbackEnabledOutputStream extends OutputStream {
    private OutputStreamListener outputStreamListener;
    private OutputStream realOutputStream;
    private int byteWriteThreshold;
    private int bytesWritten = 0;

    public CallbackEnabledOutputStream(OutputStreamListener outputStreamListener, OutputStream realOutputStream, int byteWriteThreshold) {
        super();
        this.outputStreamListener = outputStreamListener;
        this.realOutputStream = realOutputStream;
        this.byteWriteThreshold = byteWriteThreshold;
    }

    @Override
    public void write(int b) throws IOException {
        realOutputStream.write(b);
        bytesWritten++;
        if(bytesWritten > byteWriteThreshold) {
            outputStreamListener.bytesWritten(bytesWritten);
            bytesWritten = 0;
        }
    }

    @Override
    public void flush() throws IOException {
        realOutputStream.flush();
    }

    @Override
    public void close() throws IOException {
        realOutputStream.flush();
    }
}

OutputStreamListener

public class OutputStreamListener {

    private int byteCount = 0;

    public void bytesWritten(int byteCount) {
        this.byteCount += byteCount;
    }

    public int getByteCount() {
        return byteCount;
    }
}
相关问题