2010-10-22 58 views
1

所以在Android瀏覽器或網頁視圖工作正常使用URL這樣的 - abc.com/xyz.txtAndroid瀏覽器/ webview錯誤?內容處理:附件;文件名=「xyz.txt將該」

但是,如果你的URL看起來像這樣 - abc.com/xyz.php以及在標題中發送給瀏覽器的內容是 - Content-Disposition:附件;文件名=「xyz.txt」,那麼Android瀏覽器和網絡視圖似乎變得非常困惑。

它看起來像是在手機上保存了正確的文件名,但內容中充滿了先前正在查看的網頁。這在基於PC的瀏覽器以及iPhone和Blackberry上運行得非常好,這只是Android 2.1和2.2上的一個問題(尚未測試其他)。

任何人都有解決方案?將非常感激。我真的不想開始存儲靜態文件,並希望即時生成我的下載內容。手機上的日誌沒有透露任何線索。


這裏是什麼服務器發送到瀏覽器

===================== start content ==================================== 
HTTP/1.1 200 OK 
Date: Thu, 21 Oct 2010 21:22:11 GMT 
Server: Apache 
Content-Disposition: attachment; filename="Wafty.txt" 
Content-length: 30 
Content-Type: text/plain; charset=ISO-8859-1 

Hello this is a test of a file 
========= There was no carriage return at the end of the above line ==== 
+0

動態生成的下載內容,存儲到一個臨時文件,併發出301重定向到它。通過cron作業/計劃任務清理生成的內容。這可能很尷尬 - 這只是一個想法。 – CommonsWare 2010-10-22 00:21:51

+3

@CommonsWare:它冒犯了我的感情! :-) – 2010-10-22 00:28:10

+0

嘗試將Content-Type更改爲「application/octet-stream」。 – clu3Less 2013-11-05 09:41:51

回答

1

使用

Content-Disposition: attachment;filename="xyz.txt" 

不使用

Content-Disposition: attachment; filename="xyz.txt" 
+0

我有幾個Web服務,該空間不會造成問題。以下是一個響應頭示例:Content-Disposition:attachment;文件名= 「test.txt的」 – Sal 2017-06-02 13:45:23

1

我有類似的問題,以你的。這裏的問題是WebView如何處理附件(真正的麻煩)。當WebView訪問一個網頁時,有時會返回一個附件,它說有點像「哦,廢話,我可以用這個非HTML的東西做什麼?... Ey you!DownloadListener!用這個網址做些什麼一些關於附件的廢話「。因此,DownloadListener接管了這個問題:它再次請求相同的URL來下載附件,因此,在訪問頁面時下載附件時,WebView會執行2個請求:頁面本身,然後是另一個頁面以下載附件,而不是隻下載它。

這是怎麼回事?好吧,讓我們說,你abc.com/xyz.php你有一些邏輯,如:

<?php 
    if(User::loggedIn()) { 
     header("Content-Disposition: attachment..."); 
     //Some more logic for the download 
    } 
?> 

由DownloadListener進行的第二次請求會再拍請求abc.com/xyz.php但這次將不包含cookie或會話信息,因此不會進入「下載」邏輯。

一個可能的解決方案是重定向到臨時副本或文件的實際路徑,該文件不包含任何邏輯,因此沒有問題。當然,你也需要用你的WebView來定義你的下載監聽器,例如這樣的。

webView.setDownloadListener(new DownloadListener() { 

    @Override 
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) { 

     final DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
     Request request = new DownloadManager.Request(Uri.parse(url)); 
     request.setMimeType(mimeType); 

     //Persist download notification in the status bar after the download completes (Android 3.0+) 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      request.allowScanningByMediaScanner(); 
      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
     } 

     dm.enqueue(request); 
    } 

});