文件下載的實質就是文件拷貝,將文件從服務器端拷貝到瀏覽器端。所以文件下載需要IO技術將服務器端的文件使用InputStream讀取到,在使用 ServletOutputStream寫到response緩沖區中。
代碼如下:

上述代碼可以將圖片從服務器端傳輸到瀏覽器,但瀏覽器直接解析圖片顯示在頁面上,而不是提供下載,我們需要設置兩個響應頭,告知瀏覽器的類型和文件的打開方式。
1)告知瀏覽器文件的類型:response.setContentType(文件的MIME類型);
2)告示瀏覽器文件的打開方式是下載:
response.setHeader("Content-Disposition","attachment;filename=文件名稱");
代碼如下:

但是,如果下載中文文件,頁面在下載時會出現中文亂碼或不能顯示文件名的情況, 原因是不同的瀏覽器默認對下載文件的編碼方式不同,ie是UTF-8編碼方式,而火狐 瀏覽器是Base64編碼方式。所里這里需要解決瀏覽器兼容性問題,解決瀏覽器兼容 性問題的首要任務是要辨別訪問者是ie還是火狐(其他),通過Http請求體中的一 個屬性可以辨別

解決亂碼方法如下(不要記憶--了解): if (agent.contains("MSIE")) { // IE瀏覽器 filename = URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", " "); } else if (agent.contains("Firefox")) { // 火狐瀏覽器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它瀏覽器 filename = URLEncoder.encode(filename, "utf-8"); } 其中agent就是請求頭User-Agent的值

關於Response的細節點需要注意:
① response 獲得的流不需要手動關閉,Tomcat容器會幫助我們關閉
② getWriter 和 getOutputStream 不能同時調用

