使用BufferedInputStream跟踪Android设备上文件上传的进度

时间:2018-11-15 08:28:27

标签: upload progress

Content-Type不是多部分且为"Content-Type", "application/octet-stream"的情况下如何跟踪文件上载的进度。有一些解决方案可以循环计数,但是在原始流写入输出流之后,它们会失败,因为原始流会通过网络传输。

以下是我的代码

HttpURLConnection urlConnection = null;
URL url = new URL(strUrl);

if (Utils.isValidURLForHttp(strUrl)) {
    urlConnection = (HttpURLConnection) url.openConnection();
} else {
    urlConnection = (HttpsURLConnection) url.openConnection();
}

String headerString = "";
if (headers != null) {
    for (Map.Entry<String, String> entry : headers.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        // do stuff
        urlConnection.setRequestProperty(key, value);
        headerString += key + ": " + value + "\n";
    }
}
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
//urlConnection.setFixedLengthStreamingMode(1000);
urlConnection.setConnectTimeout(1000 * Constants.CONNECTION_TIME_OUT_SEC);
urlConnection.setReadTimeout(1000 * Constants.READ_TIME_OUT_IMAGE_UPLOAD_SEC);

String filePath = uri.getPath();
File file = new File(filePath);

OutputStream outputStream = urlConnection.getOutputStream();
FileInputStream fileInputStream = new FileInputStream(file);

int bytesAvailable = fileInputStream.available();
int maxBufferSize = 32768;
int bufferSize = Math.min(bytesAvailable, maxBufferSize);

byte[] buffer = new byte[(int) file.length()/* bufferSize*/];
int bytesRead = -1;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, bytesRead);
    Log.d("tagProgressUpload","Upload ");
}
outputStream.flush();
fileInputStream.close();


///
InputStream inputStream = null;
try {
    inputStream = new BufferedInputStream(urlConnection.getInputStream());

} catch (Exception ex) {
    inputStream = new BufferedInputStream(urlConnection.getErrorStream());
}


String jsonResponse = readResponseContents(inputStream);

String responseHeaders = getResponseHeaders(urlConnection);

Logger.getInstance().logInfo(strUrl +
        "\n" + Constants.APIVerbs.DELETE +
        "\n" + headerString +
        "Request body: " + body +
        "\n" + "Status Code: " + urlConnection.getResponseCode() +
        "\n" + "ResponseHeaders: " + responseHeaders +
        "\n" + "Response: " + jsonResponse
);

Response response = new Response();
response.setResponse(jsonResponse);
response.setStatusCode(urlConnection.getResponseCode());
response.setStatusMessage(urlConnection.getResponseMessage());

HashMap<String, String> headers = new HashMap<>();
for (Map.Entry<String, List<String>> entries : urlConnection.getHeaderFields().entrySet()) {
    headers.put(entries.getKey(), entries.getValue().get(0));
}
response.setResponseHeaders(headers);
return response;

0 个答案:

没有答案