簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM