2009-11-11 19 views
16

Pobieram programowo pliki z serwera WWW. Po zakończeniu pobierania sprawdziłem plik. Rozmiar, rozszerzenie i wszystkie pozostałe parametry są poprawne, ale kiedy próbuję odtworzyć ten plik w odtwarzaczu multimedialnym, pokazuje się, że jest uszkodzony.Pobierz plik programowo na Androida

Oto mój kod:

byte[] b = null; 
    InputStream in = null; 
    b = new byte[Integer.parseInt(size)]; // size of the file. 
    in = OpenHttpConnection(URL);    
    in.read(b); 
    in.close(); 

    File folder = new File("/sdcard", "folder"); 
    boolean check = folder.mkdirs(); 

    Log.d("HttpDownload", "check " + check); 

    File myFile = new File("/sdcard/folder/" + name); 


    myFile.createNewFile(); 
    OutputStream filoutputStream = new FileOutputStream(myFile); 

    filoutputStream.write(b); 

    filoutputStream.flush(); 

    filoutputStream.close(); 

Odpowiedz

25

To jest działający kod, który mam do pobrania danego adresu URL do danego obiektu File. Obiekt File (outputFile) właśnie został utworzony przy użyciu nowego pliku (ścieżka), nie wywołałem createNewFile ani nic.

private static void downloadFile(String url, File outputFile) { 
    try { 
     URL u = new URL(url); 
     URLConnection conn = u.openConnection(); 
     int contentLength = conn.getContentLength(); 

     DataInputStream stream = new DataInputStream(u.openStream()); 

     byte[] buffer = new byte[contentLength]; 
     stream.readFully(buffer); 
     stream.close(); 

     DataOutputStream fos = new DataOutputStream(new FileOutputStream(outputFile)); 
     fos.write(buffer); 
     fos.flush(); 
     fos.close(); 
    } catch(FileNotFoundException e) { 
     return; // swallow a 404 
    } catch (IOException e) { 
     return; // swallow a 404 
    } 
} 
+0

to możliwe, aby pobrać plik wideo z tego samego ?? –

+1

Służy do pobierania plików. Możesz pobrać pliki wideo, jasne. Ale jeśli chodzi o przesyłanie strumieniowe wideo, nie, do tego chcesz użyć różnych interfejsów API. – Konklone

+1

Jak utworzyć plik wyjściowy do przekazania? – Vasant

0

odczyt strumienia wejściowego nie gwarantuje, że cała zawartość pliku zostanie za jednym razem usunięta. Sprawdź zwracaną wartość na tym in.read (b); linia. Może wyglądać mniej więcej tak:

if(in.read(b) != size) 
    Log.e("Network","Failed to read all data!"); 

To ci powie, przynajmniej jeśli otrzymujesz wszystkie swoje dane z warstwy sieci. Jeśli masz tylko częściową lekturę, ale wciąż zapisujesz pełną tablicę bajtów na dysku, to może wyjaśnić, dlaczego odtwarzacz uważa, że ​​plik jest uszkodzony.

1
private void down(String string) 
    { 

     try 
     { 
      URL url = new URL(URL); 
      HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); 

      String PATH = Environment.getExternalStorageDirectory().toString() 
        + "/load"; 
      Log.v("LOG_TAG", "PATH: " + PATH); 

      File file = new File(PATH); 
      file.mkdirs(); 
      File outputFile = new File(file, option14[i].toString()); 
      FileOutputStream fos = new FileOutputStream(outputFile); 
      InputStream is = c.getInputStream(); 

      byte[] buffer = new byte[4096]; 
      int len1 = 0; 

      while ((len1 = is.read(buffer)) != -1) 
      { 
       fos.write(buffer, 0, len1); 
      } 

      fos.close(); 
      is.close(); 

      Toast.makeText(this, " A new file is downloaded successfully", 
        Toast.LENGTH_LONG).show(); 

     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 
+0

to działało dobrze dla mnie! Dziękuję Ci. ale czy możesz wyjaśnić tę linijkę: byte [] buffer = new byte [4096]; ? czy jest to maksymalna liczba bajtów dozwolona dla pliku? –