【问题标题】:get progress when Uploading Image上传图片时获取进度
【发布时间】:2017-01-09 11:53:45
【问题描述】:

我想在将任何图像上传到服务器时取得进展。比如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");

请帮助我。谢谢

【问题讨论】:

标签: android server image-uploading


【解决方案1】:

查看此处提供的答案:

要清楚,您的图像也是一个文件。

指南的直接来源:

【讨论】:

  • 您能否提一下..我的问题在您的链接中的解决方案在哪里?
  • 当然这不是复制粘贴的意思,因为这个网站不是为您提供复制粘贴解决方案的,而是您自己进行研究。我们只是为您指明正确的方向。
  • 不错!很抱歉没有直接提供所有内容,但总的来说,为了将来的最佳实践,最好让开发人员知道如何根据研究找到他们的解决方案:一点阅读。是的,烦人,非常。
【解决方案2】:

我使用了以下方法:

这里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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多