案例:實現文件的下載功能
* 文件下載需求:
- 頁面顯示超鏈接
- 點擊超鏈接後彈出下載提示框
- 完成圖片文件下載
* 分析:
- 超鏈接指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示,如果不能解析,則彈出下載提示框。不滿足需求
- 任何資源都必須彈出下載提示框
- 使用響應頭設置資源的打開方式:
* content-disposition:attachment;filename=xxx
* 步驟:
- 定義頁面,編輯超鏈接href屬性,指向Servlet,傳遞資源名稱filename
- 定義Servlet
1. 獲取文件名稱
2. 使用字節輸入流加載文件進內存
3. 指定response的響應頭: content-disposition:attachment;filename=xxx
4. 將數據寫出到response輸出流
這兒有 源碼
package cn.itcast.web.download;
import cn.itcast.web.utils.DownLoadUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.獲取請求參數,文件名稱
String filename = request.getParameter("filename");
//2.使用字節輸入流加載文件進內存
//2.1找到文件服務器路徑
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//2.2用字節流關聯
FileInputStream fis = new FileInputStream(realPath);
//3.設置response的響應頭
//3.1設置響應頭類型:content-type
String mimeType = servletContext.getMimeType(filename);//獲取文件的mime類型
response.setHeader("content-type",mimeType);
//3.2設置響應頭打開方式:content-disposition
//3.2.1解決中文文件名問題
//1.獲取user-agent請求頭、
String agent = request.getHeader("user-agent");
//2.使用工具類方法編碼文件名即可
filename = DownLoadUtils.getFileName(agent, filename);
response.setHeader("content-disposition","attachment;filename="+filename);
//4.將輸入流的數據寫出到輸出流中
ServletOutputStream sos = response.getOutputStream();
byte[] buff = new byte[1024 * 8];
int len = 0;
while((len = fis.read(buff)) != -1){
sos.write(buff,0,len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}