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 ответа:
3.png
это каталог, потому что вы делаете это так, вызываяf.mkdirs();
. Попробуйтеf.getParentFile().mkdirs()
вместо этого. Из документации :Создает каталог , названный этим абстрактным именем пути, включая все необходимые, но несуществующие родительские каталоги. Обратите внимание, что в случае неудачи этой операции, возможно, удалось создать некоторые из необходимых родительских каталогов.
(Курсив мой). Другими словами, весь путь, содержащийся в экземпляре
File
f
, берется в быть именем каталога, вплоть до и включая конечную часть (3.png
в Примере вывода).
Проблема в том, что вы используете функцию
f.mkdirs();
Эта функция создаст папку с именем " 3.png "вместо файла под названием" 3.png", поэтому сначала удалите эту папку,
Затем замените функцию
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);