Отображение процента прогресса с использованием API Apache для загрузки файлов в Android - PullRequest
1 голос
/ 14 марта 2012

Следующий код загружает файл на сервер, отображает диалоги выполнения с процентами без каких-либо проблем.

protected boolean uploadFile(String serverUrl, String filePath) {
            HttpURLConnection connection = null;
            DataOutputStream outputStream = null;
            DataInputStream inputStream = null;
            int bytesRead, bytesAvailable, bufferSize;
            byte[] buffer;
            int serverResponseCode;
            String serverResponseMessage;
            boolean uploadstatus = false;
            int count;
            long lengthOfFile;

            try {
                urlServer = serverUrl;
                pathFile = filePath;

                FileInputStream fileInputStream;
                fileInputStream = new FileInputStream(new File(pathFile));
                URL url = new URL(urlServer);
                connection = (HttpURLConnection) url.openConnection();
                // Allow Inputs & Outputs
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.setUseCaches(false);
                // Enable POST method
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Connection", "Keep-Alive");
                connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                outputStream = new DataOutputStream(connection.getOutputStream());
                outputStream.writeBytes(twoHyphens + boundary + lineEnd);
                outputStream.writeBytes(lineEnd);
                lengthOfFile = new File(filePath).length();// length of file
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[1024];
                bytesRead = 0;
                String progressMsg = "";
                while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                    total += bytesRead;
                    progressMsg = new StringBuffer(" ").append((int) ((total * 100) / totalLengthOfFile)).toString();
                    prgressBarMsg[0] = progressMsg;
                    publishProgress(prgressBarMsg);
                    outputStream.write(buffer);// , 0, bufferSize);
                }
                outputStream.writeBytes(lineEnd);
                outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                // Responses from the server (code and message)
                serverResponseCode = connection.getResponseCode();
                serverResponseMessage = connection.getResponseMessage();
                if (serverResponseCode == 200)// HTTP OK Message from server
                {
                    uploadstatus = true;
                } else {
                    uploadstatus = false;
                }
                // this block will give the response of upload link
                try {
                    BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    String line;
                    while ((line = rd.readLine()) != null) {
                        // Log.i("ARC", "RES Message: " + line);
                    }
                    rd.close();
                } catch (IOException ioex) {
                    // Log.e("ARC", "error: " + ioex.getMessage(), ioex);
                }
                fileInputStream.close();
                outputStream.flush();
                outputStream.close();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                connection.disconnect();
            }
            return uploadstatus;
        }

Следующий код, использующий Apache, также загружает файл на сервер и рекомендуется для загрузки файлов с большими размерами (этоболее стабильный), но он немного медленнее с точки зрения времени загрузки по сравнению с приведенным выше кодом.Я обнаружил код, использующий исключение HttpURLConnection, когда размер файла превышает 20 МБ, поэтому я сейчас реализую код загрузки файла с использованием Apache.

protected boolean uploadFile(String serverUrl, String filePath) {
        boolean status = false;
        try {
            File file = new File(filePath);
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost postRequest = new HttpPost(serverUrl);
            FileBody bin = new FileBody(file);
            MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.STRICT);
            reqEntity.addPart("myfile", bin);
            postRequest.setEntity(reqEntity);
            HttpResponse response = httpClient.execute(postRequest);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
                String sResponse;
                StringBuilder responseMsg = new StringBuilder();
                while ((sResponse = reader.readLine()) != null) {
                    responseMsg = responseMsg.append(sResponse);
                }
            }
            status = true;
        } catch (ClientProtocolException e) {
        } catch (IOException e) {
        }
        return status;
    }

Я хочу отобразить диалог выполнения с процентами для загрузки файла с использованием кода Apache.Как мы можем получить значение bytesRead, используемое для вычисления процентного показателя хода выполнения для кода Apache?

Любые предложения / советы по реализации того же самого помогут вам.

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Хотя это немного сложно, но вы можете достичь этого. Я нашел этот вопрос действительно полезным.*

0 голосов
/ 02 апреля 2012

Следующая ссылка решила мою проблему

http://toolongdidntread.com/android/android-multipart-post-with-progress-bar/

...