2010-09-16 116 views
3

我有以下代碼Grails的 - 如何強制下載文件,其擴展

def fileDoc = new File(document.documentLocation); 
    if(fileDoc.exists()){ 
     // force download 
     def fileName = fileDoc.getName(); 
     response.setContentType("application/octet-stream") 
     response.setHeader "Content-disposition", "attachment; filename=${fileName}" ; 
     response.outputStream << fileDoc.newInputStream(); 
     response.outputStream.flush(); 
     return true; 
    } 

documentLocation包含字符串,如 「C:\ mydoc \ contains_some_long_string_with_id.pdf」 爲例。

我希望用戶下載文件,而不是從瀏覽器中查看它。它可以很好地工作在鉻我可以下載和文件將顯示「另存爲」「contains_some_long_string_with_id.pdf」

但在Firefox(最新之一)..文件名是殘廢爲「contains_some_long」只(沒有pdf最後的延期)。

如何解決這個問題?該文件可以是csv,pdf,文本,html,zip,pdf或其他文件格式。

謝謝

回答

1

內容類型的字符串有可能需要蜜蜂的MIME類型您正在下載的文件。

例如。對於PDF,它可能應該是「應用程序/ pdf」

+0

但用戶可以放任何格式的任何文件。它在Chrome瀏覽器上運行良好,但在Firefox上文件名將被損壞 – nightingale2k1 2010-09-16 07:56:42

+0

您的代碼可以在下載時檢查文件擴展名並設置正確的文件類型嗎?我認爲這可能是firefox打破擴展的原因。但我可能是錯的。 – 2010-09-17 00:10:51

1

您可能有空間或特殊字符混淆Firefox。文件名應該是一個帶引號的字符串:

response.setHeader "Content-disposition", "attachment; filename=\"${fileName}\""; 

RFC 2616, section 19.5.1