在Android上下载 - FileNotFoundException但文件存在

时间:2011-08-16 14:41:04

标签: java android download filenotfoundexception

我尝试从Android服务器下载文件,但我得到的只是FileNotFoundException。

我的下载方法适用于我提供的所有文件,但不适用于此特定网址。 它不起作用的网址如下所示:http://server.com/download.aspx?action=geta&sid=12345&file=somedata.xml&client=android

我看到网址中没有错误,如果我将其输入到网络浏览器中,我会立即获取该文件。权限也没关系,我可以使用该方法从服务器下载每个其他文件,例如使用“getfile”而不是“get”,但我想下载的文件只能通过“get”访问,所以我可以不能替换它。

无论如何,这是我的下载方法:

public String downloadURL (URL url, String fileName) throws IOException {
    String destination = null;

    try {           
        destination = Environment.getExternalStorageDirectory() + "/" 
                + "myapp/" + fileName;

        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream(destination);

        byte buffer[] = new byte[1024];
        int bytes = 0;

        while ((bytes = input.read(buffer)) != -1) {
            output.write(buffer,0, bytes);
        }

        output.flush();
        output.close();
        input.close();

    }
    catch (Exception e) {
        Log.e("DOWNLOAD URL", "downloading file failed due to " + e.toString());
    }

    return destination; 
}

我在这里绝望,我搜索StackOverflow一段时间但没有解决方案,非常感谢你的帮助。

编辑:错误堆栈,如果是,我认为是:

  

08-16 17:32:58.530:WARN / System.err(24754):java.io.FileNotFoundException:http://myfirm.com/download.aspx?action=get&sid=6d62429x-4e1c&file=data.xml&client=android   08-16 17:32:58.530:WARN / System.err(24754):at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:532)   08-16 17:32:58.530:WARN / System.err(24754):at java.net.URL.openStream(URL.java:645)   08-16 17:32:58.530:WARN / System.err(24754):at myapp.cont.fetch.Downloader.downloadURL(Downloader.java:412)   08-16 17:32:58.530:WARN / System.err(24754):at myapp.cont.fetch.Downloader.getData(Downloader.java:465)   08-16 17:32:58.530:WARN / System.err(24754):at myapp.cont.fetch.Downloader $ GetFilesTask.doInBackground(Downloader.java:245)   08-16 17:32:58.530:WARN / System.err(24754):at myapp.cont.fetch.Downloader $ GetFilesTask.doInBackground(Downloader.java:1)   08-16 17:32:58.530:WARN / System.err(24754):在android.os.AsyncTask $ 2.call(AsyncTask.java:252)   08-16 17:32:58.530:WARN / System.err(24754):at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:305)   08-16 17:32:58.530:WARN / System.err(24754):at java.util.concurrent.FutureTask.run(FutureTask.java:137)   08-16 17:32:58.530:WARN / System.err(24754):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)   08-16 17:32:58.530:WARN / System.err(24754):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:574)   08-16 17:32:58.530:WARN / System.err(24754):at java.lang.Thread.run(Thread.java:1020)

3 个答案:

答案 0 :(得分:3)

问题在于您的目标文件。 SDCard上不存在目录 myapp ,或者您未在manifest中包含写入SD卡的权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

答案 1 :(得分:2)

很难说没有更准确的信息,但我的预感是你需要在尝试写入之前创建本地文件:

 File f = new File(Environment.getExternalStorageDirectory() + "/" 
            + "myapp/" + fileName);
 if(!f.exists()){
   f.createNewFile();
 }
 OutputStream output = new FileOutputStream(f);

答案 2 :(得分:0)

为URL对象创建连接。 HttpURLConnection conn =(HttpURLConnection)url.openConnection();

然后将inputstream读作conn.getInputStream();

我有类似的问题。修正了这种方式。