2017-08-03 49 views
7

Jestem całkowicie nowy w rozwoju Androida i wysłałem duży plik poprzez httpurlconnection w Androidzie. kod I używany do przesyłania plików przez HttpURLConnection jestJak zatrzymać Httpurlconnection w Androidzie na przycisku kliknij

try { 
      FileInputStream fileInputStream = new FileInputStream(new File(
        pathToOurFile)); 

      URL url = new URL(urlServer); 
      connection = (HttpURLConnection) url.openConnection(); 

      // Allow Inputs & Outputs 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setUseCaches(false); 
      connection.setChunkedStreamingMode(1024) 

      // 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); 


      // TOKENID 
      String token = "anyvalye"; 
      outputStream.writeBytes("Content-Disposition: form-data; name=\"Token\"" + lineEnd); 
      outputStream.writeBytes("Content-Type: text/plain;charset=UTF-8" + lineEnd); 
      outputStream.writeBytes("Content-Length: " + token.length() + lineEnd); 
      outputStream.writeBytes(lineEnd); 
      outputStream.writeBytes(token + lineEnd); 
      outputStream.writeBytes(twoHyphens + boundary + lineEnd); 

      String connstr = null; 
      connstr = "Content-Disposition: form-data; name=\"UploadFile\";filename=\"" 
        + pathToOurFile + "\"" + lineEnd; 

      outputStream.writeBytes(connstr); 
      outputStream.writeBytes(lineEnd); 

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

      System.out.println("Initial Max Size" + bytesAvailable + ""); 
      buffer = new byte[bufferSize]; 

      // Read file 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
      try { 
       while (bytesRead > 0) { 
        try { 
         outputStream.write(buffer, 0, bufferSize); 
        } catch (OutOfMemoryError e) { 
         e.printStackTrace(); 
         response = "outofmemoryerror"; 
         return response; 
        } 
        bytesAvailable = fileInputStream.available(); 
        bufferSize = Math.min(bytesAvailable, maxBufferSize); 
        bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
       response = "error"; 
       return response; 
      } 
      outputStream.writeBytes(lineEnd); 
      outputStream.writeBytes(twoHyphens + boundary + twoHyphens 
        + lineEnd); 

      // Responses from the server (code and message) 
      int serverResponseCode = connection.getResponseCode(); 
      String serverResponseMessage = connection.getResponseMessage(); 
      System.out.println("Server Response Code " + " " + serverResponseCode); 
      System.out.println("Server Response Message "+ serverResponseMessage); 

      if (serverResponseCode == 200) { 
       response = "true"; 
      }else 
      { 
       response = "false"; 
      } 

      fileInputStream.close(); 
      outputStream.flush(); 

      connection.getInputStream(); 
      //for android InputStream is = connection.getInputStream(); 
      java.io.InputStream is = connection.getInputStream(); 

      int ch; 
      StringBuffer b = new StringBuffer(); 
      while((ch = is.read()) != -1){ 
       b.append((char)ch); 
      } 

      String responseString = b.toString(); 
      System.out.println("response string is" + responseString); //Here is the actual output 

      outputStream.close(); 
      outputStream = null; 

     } catch (Exception ex) { 
      // Exception handling 
      response = "error"; 
      System.out.println("Send file Exception" + ex.getMessage() + ""); 
      ex.printStackTrace(); 
     } 
     return response; 
    } 

poznałem, że podczas pobierania plików, możemy wstrzymać i wznowić pobieranie i istnieje wiele dostępnych kodów. Próbowałem tych kodów, a także otrzymałem rozwiązanie.

Ale czy mogę wstrzymać i wznowić proces przesyłania w Httpurlconnection. Przebacz mi, jeśli moje pytanie jest głupie, ponieważ nowo się uczę tego pojęcia. Czy ktoś może mi pomóc, aby wstrzymać i wznowić przesyłanie, ponieważ do mojej wiedzy nie ma dostępnych kodów?

Po debugowania, otrzymuję odpowiedź dla rozmiaru pliku przesłać tutaj na tym kawałku kodu,

bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
      try { 
       while (bytesRead > 0) { 
        try { 
         outputStream.write(buffer, 0, bufferSize); 
        } catch (OutOfMemoryError e) { 
         e.printStackTrace(); 
         response = "outofmemoryerror"; 
         return response; 
        } 
        bytesAvailable = fileInputStream.available(); 
        bufferSize = Math.min(bytesAvailable, maxBufferSize); 
        bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
       response = "error"; 
       return response; 
} 
     } 

nadzieję uzyskać jakąś pomoc, aby zaktualizować siebie.

+0

Wstrzymanie/wznowienie strumienia to funkcja podana przez zdolność dwóch klientów do obsługi pola nagłówka 'Range'. Jeśli nadawca (czyni to serwer lub klienta) jest w stanie obsłużyć wysyłanie fragmentów treści, a odbiorca jest w stanie obsłużyć rekonstrukcję, powinien działać całkiem podobnie. [Tutaj wyjaśnienie, jak to działa] (https://superuser.com/questions/641950/how-do-pause-able-downloads-work). Będziesz musiał również dostosować serwer, aby obsługiwać częściowe przesyłanie, nie sądzę, że może to zrobić samodzielnie, ponieważ on pliki do pobrania. – bracco23

+0

@ bracco23 to urlconnection.setChunkedStreamingMode (1024) na tyle, aby wysłać plik jako porcję od strony klienta do serwera? –

+0

Prawdopodobnie będzie to część kodu, ale musisz najpierw upewnić się, że twój serwer obsługuje pliki wysłane w porcjach. Będziesz także musiał obsłużyć, aby zachować liczbę wysłanych kawałków i te, które chcesz wysłać, aby móc je wznowić. – bracco23

Odpowiedz

0
``` 
bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
      try { 
       while (bytesRead > 0) { 
        try { 
         outputStream.write(buffer, 0, bufferSize); 
        } catch (OutOfMemoryError e) { 
         e.printStackTrace(); 
         response = "outofmemoryerror"; 
         return response; 
        } 
        bytesAvailable = fileInputStream.available(); 
        bufferSize = Math.min(bytesAvailable, maxBufferSize); 
        bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
       response = "error"; 
       return response; 
} 
     } 
    ```