我试图从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)