上传图片时取得进展

get progress when Uploading Image

我想在将任何图像上传到服务器时获得进度。比如1%、30%等等。 我使用了不同网站上已经提供的所有解决方案,但我在写入 DataOutputStream 时获得了读取文件的进展。

例如。

   while (bytesRead > 0) {
                        dos.write(buffer, 0, bufferSize);
                        sentBytes += bufferSize;
                        bytesAvailable = fileInputStream.available();
                        bufferSize = Math.min(bytesAvailable, maxBufferSize);
                        if (bytesAvailable > 0) {
                            float progress = ((float) sentBytes / (float) totalAvailable) * 100.0f;
                            if (progress % 10 == 0) {
                                publishProgress(sourceFile, (int) progress);
                            }
                        } else {
                            publishProgress(sourceFile, 100);
                        }
                        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                    }

在这里,我立即获得 100%。但在获得 100% 后,它仍在这一行上传图像:

        /*Responses from the server (code and message)*/
            int serverResponseCode = conn.getResponseCode();

我觉得只有这一行只负责上传图片。 那么我怎样才能获得实际的服务器上传进度。

服务器端有要求吗? 我的服务器支持

 connection.setRequestProperty("Content-Type", "application/octet-stream");

请帮帮我。谢谢

查看此处提供的答案:

  • SO: Android - Uploading a file

你的图片也是一个文件,要清楚。

指南的直接来源:

我使用了以下方法:

这里publishProgress()是更新progressBar。

public String uploadFileWithProgress(String fileName, String serverUrl) {
    Lg.info(DEBUG_TAG, "uploadFile fileName:" + fileName);
    Lg.info(DEBUG_TAG, "uploadFile" + "serverUrl: " + serverUrl);

    HttpURLConnection conn = null;

    File sourceFile = new File(fileName);

    String response = null;

    Lg.info(DEBUG_TAG, "sourceFile: " + sourceFile.toString());

    if (!sourceFile.isFile()) {
    } else {

        HttpURLConnection.setFollowRedirects(false);
        try {

            FileInputStream fileInputStream = new FileInputStream(sourceFile);

            conn = (HttpURLConnection) new URL(serverUrl).openConnection();
            conn.setRequestMethod("PUT");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", "application/octet-stream");
            conn.setRequestProperty("Accept", "application/json");


            conn.setReadTimeout(100000);
            conn.setConnectTimeout(100000);

            //required --->
            conn.setDoOutput(true);

            long fileLength = sourceFile.length();

            long requestLength = fileLength;
            conn.setRequestProperty("Content-length", "" + requestLength);
            conn.setFixedLengthStreamingMode((int) requestLength);
            conn.connect();
            //<-----

            DataOutputStream out = new DataOutputStream(conn.getOutputStream());

            int progress = 0;
            int bytesRead = 0;
            byte buf[] = new byte[1024];
            BufferedInputStream bufInput = new BufferedInputStream(fileInputStream);
            publishProgress(sourceFile, 0);
            lastProgressDone = 0;
            while ((bytesRead = bufInput.read(buf)) != -1) {
                // write output
                out.write(buf, 0, bytesRead);
                out.flush();
                progress += bytesRead;
                // update progress bar
                int progressDoneInPercentage = (int) (progress * 100.0 / requestLength);

                if (progressDoneInPercentage < 100 && progressDoneInPercentage != lastProgressDone) {
                    lastProgressDone = progressDoneInPercentage;
                    publishProgress(sourceFile, progressDoneInPercentage);
                }
            }

            fileInputStream.close();
            // Write closing boundary and close stream
            try {
                out.flush();
            } catch (Exception e) {
            }
            try {
                out.close();
            } catch (Exception e) {
            }

            /*Responses from the server (code and message)*/
            int serverResponseCode = conn.getResponseCode();
            String serverResponseMessage = conn.getResponseMessage();

            lastProgressDone = 0;
            if (serverResponseCode == 200) {
                publishProgress(sourceFile, 100);
            } else {
                publishProgress(sourceFile, 0);
            }
            InputStream str = conn.getErrorStream();
            Lg.info(DEBUG_TAG, "uploadFile HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);
            if (serverResponseCode == 200) {
                Lg.info(DEBUG_TAG, "uploadFile uploadComplete: " + response);
            } else{
                Lg.info(DEBUG_TAG, "uploadFile Error" + response);
            }

        } catch (OutOfMemoryError e) {
            Lg.printStackTrace(e);
        } catch (Exception e) {
            // Exception
            Lg.error("error in image uploading = " + fileName, e.getMessage());
        } finally {
            if (conn != null) conn.disconnect();
        }
    }
    return response;
}