web-dev-qa-db-fra.com

FileOutputStream se bloque avec l'erreur "Échec d'ouverture: EISDIR (est un répertoire)" lors du téléchargement de l'image

J'essaie de télécharger un iamge sur Internet, voici le code:

try {
                String imgURL = c.imgURL;
                String imgPATH = c.imgPATH;
                URL url = new URL(imgURL);
                URLConnection conexion = url.openConnection();
                conexion.connect();
                int lenghtOfFile = conexion.getContentLength();
                try {
                    File f = new File(imgPATH);
                    f.mkdirs();

                    BufferedInputStream input = new BufferedInputStream(url.openStream());
                    BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(imgPATH), 8192); // CRASH HERE

                    byte data[] = new byte[8192];
                    long total = 0;
                    int count = 0;
                    int updateUILimiter = 0;
                    while ((count = input.read(data)) != -1) {
                        total += count;

                        if (updateUILimiter == 20)
                            // publishProgress((int) (total * 100 / lenghtOfFile));
                            updateUILimiter = 0;
                        else
                            updateUILimiter++;

                        output.write(data, 0, count);

                        if (isCancelled()) {
                            output.flush();
                            output.close();
                            input.close();
                            return null;
                        }

                    }
                    output.flush();
                    output.close();
                    input.close();
                } catch (Exception e) {
                    c.imgPATH = "";
                    return null;
                }


            } catch (Exception e) {
                c.imgPATH = "";
                return null;
            }

Voici le message d'erreur:

/mnt/sdcard/tmp/3.png: échec d'ouverture: EISDIR (est un répertoire)

Pourquoi est-ce?

"/ mnt/sdcard/tmp /" existe.

27
Omar

3.png Est un répertoire, car vous le faites en appelant f.mkdirs();. Essayez plutôt f.getParentFile().mkdirs(). De la documentation :

Crée le répertoire nommé par ce chemin d'accès abstrait , y compris tous les répertoires parents nécessaires mais inexistants. Notez que si cette opération échoue, elle a peut-être réussi à créer certains des répertoires parents nécessaires.

(c'est moi qui souligne). En d'autres termes, le chemin complet contenu dans l'instance Filef est considéré comme un nom de répertoire, jusqu'à et incluant la partie finale (3.png Dans l'exemple de sortie) .

80
Dirk

Le problème est que vous utilisez la fonction

f.mkdirs();

cette fonction créera un dossier appelé "3.png" au lieu d'un fichier appelé "3.png", donc supprimez d'abord ce dossier,

enter image description here

puis remplacez la fonction

f.mkdirs();

à

f.createNewFile();

J'espère que cette aide.

14
Led Machine

remplacer f.mkdirs() par f.createNewFile().

5
user2716622

Vous pouvez d'abord créer le répertoire et ensuite écrire le code.

 URL downloadURL=null;
    HttpURLConnection urlConnection=null;
    InputStream inputStream=null;
    FileOutputStream fos=null;
    Uri uri=Uri.parse(url);
    try {
        downloadURL=new URL(url);
        urlConnection= (HttpURLConnection) downloadURL.openConnection();
        inputStream=urlConnection.getInputStream();
        File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/");
        if(!file.exists())
        {
            file.mkdirs();
        }
        File file1=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"+uri.getLastPathSegment());
        fos=new FileOutputStream(file1);
        byte[] buffer=new byte[1024];

        int read=-1;
        while((read=inputStream.read(buffer))!=-1)
        {
           /* Message.L(""+read);*/
            fos.write(buffer,0,read);
        }

    }

Comme ça, vous pouvez le faire

File file=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/");
        if(!file.exists())
        {
            file.mkdirs();
        }
        File file1=new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/myAppImages/"+uri.getLastPathSegment());
        fos=new FileOutputStream(file1);
2
surya