2009-11-11 26 views
16

Estoy descargando archivos del servidor web mediante programación. Una vez completada la descarga, verifiqué el archivo. El tamaño, la extensión y todos los demás parámetros son correctos, pero cuando intento reproducir ese archivo en el reproductor multimedia, se muestra que está dañado.Descargar un archivo mediante programación en Android

Aquí está mi código:

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

Respuesta

25

Este es un código de trabajo que tengo para descargar una URL dada a un objeto de archivo dado. El objeto File (outputFile) acaba de crearse usando el nuevo archivo (ruta), no he llamado createNewFile ni nada.

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

es posible descargar un vídeo de la misma ?? –

+1

Esto es para la descarga de archivos. Puede descargar archivos de video, claro. Pero si te refieres a la transmisión de video, no, quieres usar diferentes API para eso. – Konklone

+1

¿cómo puedo crear outputFile para pasar? – Vasant

0

leer en una secuencia de entrada no garantiza que todo el contenido del archivo se reducirá de una vez. Verifique el valor de retorno en ese in.read (b); línea. Podría ser algo como esto:

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

Que te voy a decir, por lo menos, si usted está recibiendo todos los datos de la capa de red. Si solo obtuvo una lectura parcial, pero aún está escribiendo la matriz de bytes completa en el disco, eso podría explicar por qué el reproductor multimedia cree que el archivo está dañado.

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

¡esto funcionó bien para mí! gracias. pero puede explicar esta línea: byte [] buffer = new byte [4096]; ? ¿Es la cantidad máxima de bytes permitidos para el archivo? –

Cuestiones relacionadas