Ошибка FileOutputStream с ошибкой "open failed: EISDIR (Is directory)" при загрузке изображения

Я пытаюсь загрузить iamge из Интернета, вот код:

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;
            }

Вот сообщение об ошибке:

/mnt/sdcard/tmp/3.png: open failed: EISDIR (это каталог)

Почему это?

"/mnt/sdcard/tmp/" существует.

Ответ 1

3.png - это каталог, потому что вы делаете это, вызывая f.mkdirs();. Вместо этого попробуйте f.getParentFile().mkdirs(). Из документации:

Создает каталог с именем этого абстрактного пути, включая любые необходимые, но несуществующие родительские каталоги. Обратите внимание, что если эта операция не удалась, возможно, ей удалось создать некоторые из необходимых родительских каталогов.

(акцент мой). Другими словами, весь путь, содержащийся в экземпляре File f, считается именем каталога, вплоть до конечной части (включая 3.png).

Ответ 2

Проблема в том, что вы используете функцию

f.mkdirs();

эта функция создаст папку под названием "3.png" вместо файла под названием "3.png", поэтому сначала удалите эту папку,

enter image description here

затем заменим функцию

f.mkdirs();

to

f.createNewFile();

Надеюсь на эту помощь.

Ответ 3

замените f.mkdirs() на f.createNewFile().

Ответ 4

Сначала вы можете создать каталог, а затем написать код.

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

    }

Как это можно сделать

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