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

4

我试图从Android服务器下载一个文件,但我得到的是一个FileNotFoundException。

我的下载方法对我提供的所有文件都有效,但对于这个特定的url却不起作用。 这个无法工作的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): 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): at 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)


1
你能否编辑你的帖子并提供错误堆栈?最好使用pastebin链接或类似工具。 - pkk
请记住,如果您正在使用模拟器,则需要在AVD管理器中挂载SD卡。 - Mohammad Ersan
你找到解决问题的方法了吗? - abbas.aniefa
3个回答

3

问题出在您的目标文件上。可能是SD卡上不存在myapp目录,或者您在manifest中没有包含写入SD卡的权限:

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

权限都设置好了,目录也存在,甚至其他文件都可以正常工作,但对于“get”和“data.xml”不起作用。 - metaclypse

2
很难在没有更精确的信息的情况下判断,但我的直觉是在尝试写入文件之前需要创建本地文件:
 File f = new File(Environment.getExternalStorageDirectory() + "/" 
            + "myapp/" + fileName);
 if(!f.exists()){
   f.createNewFile();
 }
 OutputStream output = new FileOutputStream(f);

问题是,这种方法适用于其他所有文件。如果没有更多信息,我很抱歉,但这就是为什么我自己感到非常绝望的原因。 - metaclypse
似乎这只发生在我们的一个服务器上,而不是其他服务器上,所以看起来这不是我的代码的问题,但我仍然很疑惑,因为在浏览器中导致“文件未找到”的URL却可以正常访问。 - metaclypse

0

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

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

我遇到了类似的问题。以这种方式解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接