FileOutputStream аварийно завершает работу с ошибкой "open failed: EISDIR (is a 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: открыть не удалось: EISDIR (это каталог)

Почему это?

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

4 25

4 ответа:

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

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

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

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

f.mkdirs();

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

Введите описание изображения здесь

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

f.mkdirs();

К

f.createNewFile();

Надеюсь, что это поможет.

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

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

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