I'm trying to download a file, but its downloading it as a directory, and Im not sure what the problem is. The class Im using ive used in other projects without issue.
outfile is the full path to the output directory, /mnt/sdcard/file.ext
public class DownloadFile {
String outfile;
String zipfile;
Context c;
Notification notification;
NotificationManager notificationManager;
ProgressBar progressBar;
private int progress = 10;
public DownloadFile(String url, String out, String zip, Context ctx) {
c = ctx;
zipfile = zip;
outfile = out;
notificationManager = (NotificationManager) c.getSystemService(
c.NOTIFICATION_SERVICE);
new Download().execute(url);
}
private class Download extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... urls) {
int count;
try {
URL url = new URL(urls[0]);
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
InputStream input = new BufferedInputStream(url.openStream());
//LINE 55 is below
OutputStream output = new FileOutputStream(outfile);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress((int)(total*100/lenghtOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
}
return zipfile;
}
protected void onPreExecute() {
Intent intent = new Intent(c, DownloadFile.class);
final PendingIntent pendingIntent = PendingIntent.getActivity(c, 0, intent, 0);
notification = new Notification(R.drawable.ic_launcher, "simulating a download", System
.currentTimeMillis());
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(c.getPackageName(), R.layout.download_progress);
notification.contentIntent = pendingIntent;
notification.contentView.setImageViewResource(R.id.status_icon, R.drawable.ic_launcher);
notification.contentView.setTextViewText(R.id.status_text, "simulation in progress");
notification.contentView.setProgressBar(R.id.status_progress, 100, progress, false);
notificationManager.notify(42, notification);
}
protected void onProgressUpdate(Integer... args){
notification.contentView.setProgressBar(R.id.status_progress, 100, args[0], false);
}
protected void onPostExecute(String f) {
Toast.makeText(c, "DONE WITH "+f, 9965454).show();
notificationManager.cancel(42);
}
}
}
This is the error that it throws.
W/System.err(15992): java.io.FileNotFoundException: /mnt/sdcard/t3hh4xx0r/romCrawler/imoseyon_leanKernel_v1.9.0gnexus.zip: open failed: EISDIR (Is a directory)
W/System.err(15992): at libcore.io.IoBridge.open(IoBridge.java:406)
W/System.err(15992): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
W/System.err(15992): at java.io.FileOutputStream.<init>(FileOutputStream.java:128)
W/System.err(15992): at java.io.FileOutputStream.<init>(FileOutputStream.java:117)
W/System.err(15992): at com.t3hh4xx0r.romcrawler.DownloadFile$Download.doInBackground(DownloadFile.java:55)
W/System.err(15992): at com.t3hh4xx0r.romcrawler.DownloadFile$Download.doInBackground(DownloadFile.java:1)
W/System.err(15992): at android.os.AsyncTask$2.call(AsyncTask.java:264)
W/System.err(15992): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
W/System.err(15992): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
W/System.err(15992): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
W/System.err(15992): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
W/System.err(15992): at java.lang.Thread.run(Thread.java:856)
W/System.err(15992): Caused by: libcore.io.ErrnoException: open failed: EISDIR (Is a directory)
W/System.err(15992): at libcore.io.Posix.open(Native Method)
W/System.err(15992): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
W/System.err(15992): at libcore.io.IoBridge.open(IoBridge.java:390)
W/System.err(15992): ... 11 more
Why is it trying to download the file as a directory?
EDIT
For a little more info on the problem, the path listed in the error, /mnt/sdcard/t3hh4xx0r/romCrawler/imoseyon_leanKernel_v1.9.0gnexus.zip
is the path and file name of the file Im trying to download. Instead of downloading though, it creates a folder with that name. I have a folder on my sdcard named imoseyon_leanKernel_v1.9.0gnexus.zip
at `/mnt/sdcard/t3hh4xx0r/romCrawler/
You have to make sure, that there is no directory with the same name. I had a similar problem. In my case it was created by File.mkdirs()
.
I would try to remove the directory before creating the FileOutputStream
:
new File(outfile).delete();
Do all the folders leading up to the location where you're trying to download the file to exist? FileOutputStream does not create folders, only files, and then only if the path leading up to the file exists.