浏览器可以解析资源文件的下载
服务器中的images资源中放了图片资源,使用超链接的形式直接可以获取文件,但是浏览器会把自己能文件解析并显示出来,不能解析的资源以附件的形式保存起来。但是不同的浏览器功能不一样,这种方式不可取。
<a href="${pageContext.request.contextPath}/images/aaa.jpg">照片1</a><br>
<a href="${pageContext.request.contextPath}/images/bbb.exe">照片2</a><br>
<a href="${pageContext.request.contextPath}/images/ccc.jpg">照片3</a><br>
<a href="${pageContext.request.contextPath}/images/ddd.jpg">照片4</a><br>
任何资源以附件形式下载
步骤
1.修改响应到客户端的请求头的一个值,让浏览不能自己解析文件。
2.连接到资源文件的输入流。
3.获取相应到客户端的输出流,并将输入流中的数据输出到客户端中。
资源文件名乱码问题
1.将文件名按当前字符编码编码
2.按目标字符解码(浏览器只能接受iso8859-1的字节,因为我们的index.jsp页面设置了utf-8的编码格式,浏览器会再将接受iso8859-1的字节编码为utf-8格式,不会出现乱码问题)
package fileDownloads;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DwnloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename ="美女.jpg";
//解决文件名中文乱码
//打撒:按当前字符编码
byte[] bytes = filename.getBytes("utf-8");
//组装:按目标字符解码
filename = new String(bytes,"ISO8859-1");
//修改头部信息content-disposition的值为attachment,并设置文件名
response.setHeader("content-disposition", "attachment;filename="+filename );
//获取连接服务器中资源的输入流
InputStream is = this.getServletContext().getResourceAsStream("/images/1.jpeg");
//获取输出流
ServletOutputStream out= response.getOutputStream();
int len =-1;
byte[] buf = new byte[1024];
while((len=is.read(buf))!=-1){
out.write(buf, 0, len);
}
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/dwnloadServlet">照片一</a><br>
</body>
</html>