【问题标题】:Downloading on Android - FileNotFoundException but file exists在 Android 上下载 - FileNotFoundException 但文件存在
【发布时间】:2011-08-16 14:41:03
【问题描述】:

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

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

我在 url 中没有看到任何错误,如果我将它输入到网络浏览器中,我会立即获取文件。权限也可以,我可以使用该方法从服务器下载所有其他文件,例如使用“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): 在 java.net.URL.openStream(URL.java:645) 08-16 17:32:58.530: WARN/System.err(24754): 在 myapp.cont.fetch.Downloader.downloadURL(Downloader.java:412) 08-16 17:32:58.530: WARN/System.err(24754): 在 myapp.cont.fetch.Downloader.getData(Downloader.java:465) 08-16 17:32:58.530: WARN/System.err(24754): 在 myapp.cont.fetch.Downloader$GetFilesTask.doInBackground(Downloader.java:245) 08-16 17:32:58.530: WARN/System.err(24754): 在 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): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 08-16 17:32:58.530: WARN/System.err(24754): 在 java.util.concurrent.FutureTask.run(FutureTask.java:137) 08-16 17:32:58.530: WARN/System.err(24754): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081) 08-16 17:32:58.530: WARN/System.err(24754): 在 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)

【问题讨论】:

  • 你能编辑你的帖子,并提供错误堆栈吗?最好使用 pastebin 链接或类似链接。
  • 记住,如果您使用的是模拟器,您需要在avd管理器中添加SD卡。
  • 您找到解决问题的方法了吗?

标签: java android download filenotfoundexception


【解决方案1】:

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

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

【讨论】:

  • 权限已设置,目录确实存在,它甚至适用于所有其他文件,但不适用于“get”和“data.xml”。
【解决方案2】:

如果没有更准确的信息很难说,但我的直觉是您需要先创建本地文件,然后再尝试写入:

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

【讨论】:

  • 问题是,这种方法适用于所有其他文件。如果没有更多信息,我很抱歉,但这就是为什么我自己很绝望。
  • 这似乎只发生在我们的一个服务器上,而不发生在其他服务器上,所以我的代码似乎没有问题,但我仍然想知道,因为导致 FileNotFound 的 url 有效在浏览器中...
【解决方案3】:

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

然后将输入流读取为 conn.getInputStream();

我遇到了类似的问题。以这种方式修复。

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多