[英]Downloading on Android - FileNotFoundException but file exists
我試圖從 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.ze6b391a8d2c45902a2a2a23a23a23a8b6585703dz.openstream(url.z933f725A0725A0742FE1C8889F4MERPEN) cont.fetch.downloader.downloadurl(downloader.z93f725a07423fe1c889f448b3333d21f46z:412)08-16 17:32:32:58.530:WARN/SYSTEM.ERR(24754):24754) -16 17:32:58.530: WARN/System.err(24754): 在 myapp.cont.fetch.Do wnloader$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.Z933F725A0725A0725A0742FE1C82FE1C8888888888B:2488B:248B: : 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):在 java.u til.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)
問題在於您的目標文件。 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 object 創建一個連接。 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
然后將輸入流讀取為 conn.getInputStream();
我有一個類似的問題。 以這種方式固定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.