文件下載需求:
1. 頁面顯示超鏈接
2. 點擊超鏈接後彈出下載提示框
3. 完成圖片文件下載
1.新建一個JAVA EE項目,配置tomcat相關設置。新建一個download.html,就是客戶端訪問的界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--文件下載需求:
1. 頁面顯示超鏈接
2. 點擊超鏈接後彈出下載提示框
3. 完成圖片文件下載
<a href="/Download/img/1.jpg">圖片1</a>
-->
<body>
<a href="/Download/downloadServlet?filename=1.jpg">圖片1</a>
<a href="/Download/downloadServlet?filename=九尾.jpg">圖片2</a>
</body>
</html>
這裏註釋中的<a href="/Download/img/1.jpg">圖片1</a>這個超鏈接,瀏覽器會直接將1.jpg給解析到瀏覽器中,就不會出現附件保存形式,所以我們這裏需要創建一個新的servlet來以附件保存的形式來保存圖片。
2.新建一個downloadServlet,實現以附件形式保存圖片的功能。分位以下幾步:
1.通過getParameter方法來獲取文件名稱(圖片文件)
2.要把這個文件通過字節輸入流加入到內存,但是出現問題,必須要找到文件所在的真實路徑。所以這裏通過一系列操作獲得到真實路徑。然後把這個文件通過字節輸入流加入到內存
3.設置response響應頭 主要是需要設置兩個,一個是響應頭類型:content-type,另一個是響應頭打開類型(附件):content-disposition
4.將輸入流數據寫到輸出流(下載)
tips:後續通過工具包,解決如果圖片是中文名字的亂碼問題。
package Download;
import 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. 獲取文件名稱
2. 使用字節輸入流加載文件進內存
3. 指定response的響應頭: content-disposition:attachment;filename=xxx
4. 將數據寫出到response輸出流
*/
String filename = request.getParameter("filename");//根據參數名稱獲取參數值
//如何理解getServletContext()方法:
//一個servlet可以使用getservletcontext()方法得到了web應用中的servletcontext,從而使用servletcontext接口的一些方法
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);//獲取文件的真實(服務器)路徑
FileInputStream fis = new FileInputStream(realPath);//用字節流關聯
//設置response響應頭 主要是需要設置兩個,一個是響應頭類型:content-type,另一個是響應頭打開類型(附件):content-disposition
String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type",mimeType);
//*************************
//解決中文命名的文件名亂碼問題
//1.獲取請求頭user-agent
String agent = request.getHeader("user-agent");
//2.使用我們下載的工具類方法去編碼文件名
filename = DownLoadUtils.getFileName(agent,filename);
response.setHeader("content-disposition","attachment;filename = "+filename);
//將輸入流數據寫到輸出流
int len = 0;
byte[] buff = new byte[1024*8];
ServletOutputStream sos = response.getOutputStream();
while ((len = fis.read(buff)) != -1){//等於-1相當於讀完了
sos.write(buff,0,len);
}
fis.close();//輸入流關掉,這裏輸出流在服務器不需要關了
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
貼一下工具包:網上很多,其實就是一個編碼和解碼的過程。
package utils;
//import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class DownLoadUtils {
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
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");
}
return filename;
}
}
驗證碼程序(servlet):
package Download;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet("/checkcodeServlet")
public class CheckcodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 50;
//1.創建一對象,在內存中圖片(驗證碼圖片對象)
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//2.美化圖片
//2.1 填充背景色
Graphics g = image.getGraphics();//畫筆對象
g.setColor(Color.PINK);//設置畫筆顏色
g.fillRect(0,0,width,height);
//2.2畫邊框
g.setColor(Color.BLUE);
g.drawRect(0,0,width - 1,height - 1);
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
//生成隨機角標
Random ran = new Random();
for (int i = 1; i <= 4; i++) {//生成4個驗證碼
int index = ran.nextInt(str.length());
//獲取字符
char ch = str.charAt(index);//隨機字符
//2.3寫驗證碼
g.drawString(ch+"",width/5*i,height/2);
}
//2.4畫干擾線
g.setColor(Color.GREEN);
//隨機生成座標點
for (int i = 0; i < 10; i++) {
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1,y1,x2,y2);
}
//3.將圖片輸出到頁面展示
ImageIO.write(image,"jpg",response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}