我有一个应用程序,可以使用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
阻止。我的理解是程序阻止,因为上传没有完成。所以我在上传过程中的问题,如何监控从客户端上传的数据量?
答案 0 :(得分:1)
在您调用ByteArrayOutputStream
或getInputStream()
之前,输出会写入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;
}
}