web-dev-qa-db-ja.com

FileOutputStreamは、イメージのダウンロード時に「open failed:EISDIR(Is a directory)」エラーでクラッシュします

私はインターネットから画像をダウンロードしようとしています、ここにコードがあります:

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 /」が存在します。

27
Omar

_3.png_はディレクトリです。f.mkdirs();を呼び出すことで作成できます。代わりにf.getParentFile().mkdirs()を試してください。 ドキュメント から:

ディレクトリを作成しますこの抽象パス名で指定された(必要だが存在しない親ディレクトリを含む)。この操作が失敗した場合、必要な親ディレクトリの作成に成功した可能性があることに注意してください。

(強調鉱山)。つまり、Fileインスタンスfに含まれるパス全体が、最後の部分(出力例では_3.png_)までのディレクトリ名と見なされます。

80
Dirk

問題は、関数を使用していることです

f.mkdirs();

この関数は、「3.png」というファイルではなく「3.png」というフォルダを作成するため、最初にこのフォルダを削除し、

enter image description here

次に、関数を置き換えます

f.mkdirs();

f.createNewFile();

この助けを願っています。

14
Led Machine

最初にディレクトリを作成してから、さらにコードを記述できます。

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