2009-11-11 15 views
16

Ich lade Dateien vom Web-Server programmgesteuert. Nachdem der Download abgeschlossen ist, habe ich die Datei überprüft. Die Größe, Erweiterung und alle anderen Parameter sind korrekt, aber wenn ich versuche, diese Datei im Media Player abzuspielen, wird angezeigt, dass sie beschädigt ist.Laden Sie eine Datei programmgesteuert auf Android

Hier ist mein Code:

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

Antwort

25

Dies ist ein funktionierender Code, den ich habe, um eine bestimmte URL zu einem bestimmten File-Objekt herunterzuladen. Das File-Objekt (outputFile) wurde gerade mit neuer Datei (Pfad) erstellt, ich habe createNewFile oder irgendetwas nicht aufgerufen.

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

ist es möglich, ein Video von der gleichen herunterladen ?? –

+1

Dies ist zum Herunterladen von Dateien. Sie können sicher Videodateien herunterladen. Aber wenn Sie das Streamen von Videos meinen, nein, Sie möchten dafür verschiedene APIs verwenden. – Konklone

+1

Wie kann ich Ausgabedatei zum Übergeben erstellen? – Vasant

0

Das Lesen eines Eingabestreams garantiert nicht, dass der gesamte Inhalt der Datei in einem Durchgang heruntergezogen wird. Überprüfen Sie den Rückgabewert auf dem in.read (b); Linie. Es könnte wie folgt aussehen:

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

Das wird Ihnen sagen, zumindest, wenn Sie alle Ihre Daten aus der Netzwerkebene sind immer. Wenn Sie nur teilweise gelesen haben, aber Sie immer noch das vollständige Byte-Array auf die Festplatte schreiben, könnte das erklären, warum der Mediaplayer die Datei für beschädigt hält.

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

das hat gut für mich funktioniert! Danke. aber kannst du bitte diese Zeile erklären: byte [] buffer = new byte [4096]; ? ist es die maximale Anzahl von Bytes für die Datei erlaubt? –

Verwandte Themen