2011-08-16 32 views
3

我試圖從Android中的服務器下載文件,但我得到的只是一個FileNotFoundException。在Android上下載 - FileNotFoundException但存在文件

我的下載方法適用於我給它的所有文件,但不適用於此特定網址。 它無法正常工作的url看起來像這樣: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: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:W ARN/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)

+1

你能編輯你的文章,並提供錯誤堆棧嗎?優選使用pastebin鏈接或類似的。 – pkk

+0

記住,如果你使用模擬器,你需要在avd管理器中添加SD卡。 –

+0

您是否找到解決問題的方法? –

回答

3

問題出在您的目標文件。無論是目錄MYAPP上不存在SD卡,或者你沒有在你的manifest包括對SD卡的寫入權限:

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

權限全部設置並且目錄確實存在,它甚至適用於其他所有文件,但不適用於「get」和「data.xml」。 – metaclypse

2

很難說沒有更精確的信息,但我的直覺是,您需要在嘗試寫入本地文件之前創建本地文件:

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

多數民衆贊成在正確的:) –

+0

事情是,這種方法適用於所有其他文件。如果沒有更多信息,我很抱歉,但這就是爲什麼我自己非常絕望。 – metaclypse

+0

似乎這隻發生在我們的一臺服務器上,而不是其他的服務器上,所以看起來這對我的代碼沒有任何問題,但我仍然想知道,因爲導致FileNotFound的url在瀏覽器中工作... – metaclypse

0

爲URL對象創建連接。 HttpURLConnection conn =(HttpURLConnection)url。的openConnection();

然後讀入inputstream爲conn.getInputStream();

我有類似的問題。修正這種方式。

相關問題