servlet 實現通過流數據傳輸下載

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Downloads extends HttpServlet {
private static final long serialVersionUID = 1L;
// 字符編碼
private final String ENCODING = "GB2312";
// 內容類型
private final String CONTENT_TYPE = "text/html;charset=gb2312";
// 要下載的文件存放的路徑
private String downloadfiledir = "C:\\Users\\786108\\Downloads\\apache-tomcat-7.0.41\\webapps\\uploadFile\\upload\\";
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 設置request對象的字符編碼
request.setCharacterEncoding(ENCODING);
// 從request中取出要下載文件的名字
String filename = request.getParameter("filename");
// 判斷傳輸過來的filename是否合法
if (filename == null || filename.trim().equals("")) {
// 設置response對象的ContentType
response.setContentType(CONTENT_TYPE);
// 輸出錯誤信息
PrintWriter out = response.getWriter();
out.println("<font color=red>輸入的文件名無效!</font>");
out.close();
} else {
// 下載文件的完整路徑名
String fullfilename = downloadfiledir + filename;
System.out.println("下載文件:" + fullfilename);
// 根據文件的類型設置response對象的ContentType
String contentType = getServletContext().getMimeType(fullfilename);
if (contentType == null)
contentType = "application/octet-stream";
response.setContentType(contentType);
// 設置response的頭信息
response.setHeader("Content-disposition", "attachment;filename=\""
+ filename + "\"");
InputStream is = null;
OutputStream os = null;
try {
is = new BufferedInputStream(new FileInputStream(fullfilename));
// 定義輸出字節流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 定義response的輸出流
os = new BufferedOutputStream(response.getOutputStream());
// 定義buffer
byte[] buffer = new byte[4 * 1024]; // 4k Buffer
int read = 0;
// 從文件中讀入數據並寫到輸出字節流中
while ((read = is.read(buffer)) != -1) {
baos.write(buffer, 0, read);
}
// 將輸出字節流寫到response的輸出流中
os.write(baos.toByteArray());
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關閉輸出字節流和response輸出流
os.close();
is.close();
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 調用doGet()方法
doGet(request, response);
}
}

 

本文出自 “某人說我技術宅” 博客,請務必保留此出處http://1992mrwang.blog.51cto.com/3265935/1243222

發佈了57 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章