要實現文件的下載,我們很清楚就會想到HttpServletResponse類向客戶端寫數據的方法,該類沒有向外寫數據的方法,於是我們找到其父類ServletResponse,父類中有如下兩個方法:
//文件流
public ServletOutputStream getOutputStream() throws IOException;
//字符流
public PrintWriter getWriter() throws IOException;
兩者的區別就是,前者是以二進制數據流傳遞,後者是字符流傳遞,前者可用來處理各類文件,而後者處理非文本文件時就可能會出現問題。
實現下載文件,無疑就是想客戶端寫回文件數據流,一般就採用getOutputStream()方法,向客戶端寫回數據。
具體步驟如下:
- 獲取下載文件的路徑
- 下載的文件名
- 讓瀏覽器支持下載的功能
- 創建下載文件的輸入流
- 創建緩衝區
- 獲取輸出流對象
- 將文件流寫入緩衝區,輸出流對象將緩衝區中的數據再寫入客戶端
- 關閉流對象
具體編碼如下:
package cn.ara.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
public class FileDownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 獲取下載文件的路徑
String realPath = this.getServletContext().getRealPath("WEB-INF\\classes\\比心.gif");
//2. 下載的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3. 讓瀏覽器支持下載的功能
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//4. 創建下載文件的輸入流
FileInputStream fileInputStream = new FileInputStream(realPath);
//5. 創建緩衝區
int len = 0;
byte[] buffer = new byte[1024];
//6. 獲取輸出流對象
ServletOutputStream outputStream = response.getOutputStream();
//7. 將文件流寫入緩衝區,輸出流對象將緩衝區中的數據再寫入客戶端。
while ((len = fileInputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
//8.關閉流對象
outputStream.close();
fileInputStream.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
文件所在路徑:
在web.xml文件中添加:
<servlet>
<servlet-name>FileDownLoadServlet</servlet-name>
<servlet-class>cn.ara.servlet.FileDownLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileDownLoadServlet</servlet-name>
<url-pattern>/fileDownLoad</url-pattern>
</servlet-mapping>
然後開啓服務器,在瀏覽器中訪問該路徑,就會出現下載文件的提示:
到此,就實現了簡單的文件下載。