我尝试从 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:警告/System.err(24754):java.io.FileNotFoundException:http://myfirm.com/download.aspx?action=get&sid=6d62429x-4e1c&file=data.xml&client=安卓 08-16 17:32:58.530: WARN/System.err(24754): 在 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:警告/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:警告/System.err(24754):在java.util.concurrent.FutureTask.run(FutureTask.java:137) 08-16 17:32:58.530:警告/System.err(24754):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081) 08-16 17:32:58.530:警告/System.err(24754):在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:574) 08-16 17:32:58.530:警告/System.err(24754):在java.lang.Thread.run(Thread.java:1020)
问题出在您的目标文件上。 SDCard 上不存在目录 myapp,或者您的
manifest
中未包含在 SD 卡上写入的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
如果没有更准确的信息,很难说,但我的预感是你需要在尝试写入之前创建本地文件:
File f = new File(Environment.getExternalStorageDirectory() + "/"
+ "myapp/" + fileName);
if(!f.exists()){
f.createNewFile();
}
OutputStream output = new FileOutputStream(f);
为 URL 对象创建连接。
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
然后将输入流读取为
conn.getInputStream();
我也有类似的问题。这样就解决了。