Question

Je rencontre des problèmes pour télécharger un fichier binaire (vidéo) dans mon application de l'Internet. Dans Quicktime, Si je télécharge directement cela fonctionne bien, mais par mon application en quelque sorte il get foiré (même si elles sont exactement les mêmes dans un éditeur de texte). Voici un exemple:

    URL u = new URL("http://www.path.to/a.mp4?video");
    HttpURLConnection c = (HttpURLConnection) u.openConnection();
    c.setRequestMethod("GET");
    c.setDoOutput(true);
    c.connect();
    FileOutputStream f = new FileOutputStream(new File(root,"Video.mp4"));


    InputStream in = c.getInputStream();

    byte[] buffer = new byte[1024];
    int len1 = 0;
    while ( (len1 = in.read(buffer)) > 0 ) {
         f.write(buffer);
    }
    f.close();
Était-ce utile?

La solution

Je ne sais pas si c'est le seul problème, mais vous avez eu un petit problème de Java classique là-bas: Vous n'êtes pas compter sur le fait que lire () est toujours autorisés à revenir moins d'octets que vous demandez. Ainsi, votre lecture pourrait obtenir moins de 1024 octets, mais votre écriture écrit toujours exactement 1024 octets pouvant inclure octets de l'itération de la boucle précédente.

Correct avec:

 while ( (len1 = in.read(buffer)) > 0 ) {
         f.write(buffer,0, len1);
 }

Peut-être la mise en réseau de latence plus ou moins la taille des paquets de 3G sur Android exacerbent l'effet?

Autres conseils

new DefaultHttpClient().execute(new HttpGet("http://www.path.to/a.mp4?video"))
        .getEntity().writeTo(
                new FileOutputStream(new File(root,"Video.mp4")));

Un problème est votre lecture de la mémoire tampon. Si chaque lecture du flux d'entrée n'est pas un multiple exact de 1024 vous permet de copier des données incorrectes. Utilisation:

byte[] buffer = new byte[1024];
int len1 = 0;
while ( (len1 = in.read(buffer)) != -1 ) {
  f.write(buffer,0, len1);
}
 public class download extends Activity {

     private static String fileName = "file.3gp";
     private static final String MY_URL = "Your download url goes here";

     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

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

            String PATH = Environment.getExternalStorageDirectory()
                + "/download/";
            Log.d("Abhan", "PATH: " + PATH);
            File file = new File(PATH);
            if(!file.exists()) {
               file.mkdirs();
            }
            File outputFile = new File(file, fileName);
            FileOutputStream fos = new FileOutputStream(outputFile);
            InputStream is = c.getInputStream();
            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len1);
            }
            fos.flush();
            fos.close();
            is.close();
        } catch (IOException e) {
            Log.e("Abhan", "Error: " + e);
        }
        Log.i("Abhan", "Check Your File.");
    } 
}

Je fixe le code basé sur des évaluations précédentes sur ce fil. Je l'ai testé à l'aide des fichiers Eclipse et plusieurs grands. Il fonctionne très bien. Suffit de copier et coller ce à votre environnement et changer le chemin http et l'emplacement que vous souhaitez le fichier à télécharger sur.

try {
    //this is the file you want to download from the remote server
    String path ="http://localhost:8080/somefile.zip";
    //this is the name of the local file you will create
    String targetFileName
        boolean eof = false;
    URL u = new URL(path);
    HttpURLConnection c = (HttpURLConnection) u.openConnection();
    c.setRequestMethod("GET");
    c.setDoOutput(true);
    c.connect();
    FileOutputStream f = new FileOutputStream(new File("c:\\junk\\"+targetFileName));
        InputStream in = c.getInputStream();
        byte[] buffer = new byte[1024];
        int len1 = 0;
        while ( (len1 = in.read(buffer)) > 0 ) {
        f.write(buffer,0, len1);
                 }
    f.close();
    } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (ProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Bonne chance Alireza Aghamohammadi

Il suffit d'utiliser la méthode de copie de apache ( Apache Commons IO ) - l'avantage d'utiliser Java

IOUtils.copy(is, os);

Ne pas oublier de fermer les flux dans un bloc finally:

try{
      ...
} finally {
  IOUtils.closeQuietly(is);
  IOUtils.closeQuietly(os);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top