Загрузка файлов с использованием HttpUrlConnection с multipart очень быстрая в Android - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь загрузить файлы, используя multipart с методом POST HttpUrlConnection.Файлы загружаются правильно, и я получаю ответ за это.Но когда я отслеживаю прогресс, он просто дает весь прогресс за 1 секунду даже для файлов> 100 МБ.Похоже, что прогресс заключается в записи файла в буфер, а не в сеть OutputStream.Вызов flush () в потоке после записи каждого куска данных не помогает.Похоже, flush просто очищает поток от сети и не ждет ответа перед записью следующего фрагмента.

Вот мой код для загрузки файла:

//Initialised in Constructor
 boundary = twoHyphens + System.currentTimeMillis() + twoHyphens;

    URL url = new URL(requestURL);
    private HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    httpConn.setUseCaches(false);
    httpConn.setDoOutput(true);
    httpConn.setDoInput(true);
    httpConn.setRequestMethod("POST");
    httpConn.setRequestProperty("Connection", "Keep-Alive");
    httpConn.setRequestProperty("Content-Type",
            "multipart/form-data; boundary=" + boundary);

   //This method is called to upload a file
   public String uploadFile(String fieldName, File uploadFile) throws IOException, InterruptedException {
    String fileName = uploadFile.getName();
    FileInputStream fileInputStream = new FileInputStream(uploadFile);
    DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(httpConn.getOutputStream()));

    dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
    dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + fieldName
            + "\"; filename=\"" + fileName + "\"" + lineEnd);
    dataOutputStream.writeBytes(lineEnd);

    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;

    //returns no. of bytes present in fileInputStream
    bytesAvailable = fileInputStream.available();

    bufferSize = 4096;
    buffer = new byte[4096];
    long size = uploadFile.length();

    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

     while (bytesRead > 0) {
        int percentage = (int) ((bytesRead / (float) size) * 100);
        dataOutputStream.write(buffer, 0, bufferSize);
        dataOutputStream.flush(); //doesn't help
        bytesAvailable = fileInputStream.available();
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    }//This finishes in 1 second

    dataOutputStream.writeBytes(lineEnd);
    dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

    int status = httpConn.getResponseCode();
    StringBuilder sb = new StringBuilder();
    BufferedReader reader = null;

    try {
        if (status == HttpURLConnection.HTTP_OK) {
            reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } else {
            throw new IOException("Server exception with status code: " + status);
        }
    } catch (Exception e) {

    } finally {
        if (reader != null) {
            reader.close();
            httpConn.disconnect();
        }
    }
    return sb.toString();
}

Любая помощь или объяснениена это действительно ценят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...