2009-11-11 6 views
16

Je télécharge des fichiers du serveur Web par programme. Une fois le téléchargement terminé, j'ai vérifié le fichier. La taille, l'extension et tous les autres paramètres sont corrects mais quand j'essaye de lire ce fichier dans le lecteur multimédia, cela montre qu'il est corrompu.Télécharger un fichier par programme sur Android

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

Répondre

25

Ceci est un code de travail que j'ai pour télécharger une URL donnée à un objet File donné. L'objet File (outputFile) vient d'être créé en utilisant un nouveau fichier (path), je n'ai pas appelé createNewFile ou quoi que ce soit.

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

est-il possible de télécharger une vidéo de la même ?? –

+1

Ceci est pour le téléchargement de fichiers. Vous pouvez télécharger des fichiers vidéo, bien sûr. Mais si vous voulez faire du streaming vidéo, non, vous voulez utiliser différentes API pour cela. – Konklone

+1

comment puis-je créer outputFile pour passer? – Vasant

0

lire sur un flux d'entrée ne garantit pas que tout le contenu du fichier sera supprimé en une fois. Vérifiez la valeur de retour sur ce en.read (b); ligne. Il pourrait ressembler à ceci:

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

Ça va vous dire, à tout le moins, si vous obtenez toutes vos données à partir de la couche réseau. Si vous avez seulement une lecture partielle, mais que vous écrivez toujours le tableau d'octets complet sur le disque, cela peut expliquer pourquoi le lecteur multimédia pense que le fichier est corrompu.

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

cela a bien fonctionné pour moi! Je vous remercie. mais pouvez-vous s'il vous plaît expliquer cette ligne: byte [] buffer = new byte [4096]; ? est-ce le nombre maximum d'octets autorisés pour le fichier? –

Questions connexes