Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FileOutputStream crashes with "open failed: EISDIR (Is a directory)" error when downloading image

I'm trying to download an iamge from the internet, Here is the 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;             } 

Here is the error message:

/mnt/sdcard/tmp/3.png: open failed: EISDIR (Is a directory)

Why is this?

" /mnt/sdcard/tmp/" exists.

like image 434
Omar Avatar asked Sep 09 '12 13:09

Omar


2 Answers

3.png is a directory, because you make it so by calling f.mkdirs();. Try f.getParentFile().mkdirs() instead. From the documentation:

Creates the directory named by this abstract pathname, including any necessary but nonexistent parent directories. Note that if this operation fails it may have succeeded in creating some of the necessary parent directories.

(emphasis mine). In other words, the entire path contained in the File instance f is taken to be a directory name, up to and including the final part (3.png in the example output).

like image 163
Dirk Avatar answered Sep 28 '22 00:09

Dirk


The problem is that you are using the function

f.mkdirs(); 

this function will create a folder called "3.png" instead of a file called "3.png", so delete this folder first,

enter image description here

then replace the function

f.mkdirs(); 

to

f.createNewFile(); 

Hope this help.

like image 27
Led Machine Avatar answered Sep 27 '22 23:09

Led Machine