文件上传下载
在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,
并且表单的请求方式为 POST;其次我们的 form 表单的 enctype 必须设
为”multipart/form-data”即 enctype="multipart/form-data"意思是设置表单的
MIME 编码。默认情况下这个编码格式是”application/x-www-form-urlencoded”,
不能用于文件上传;只有使用了 multipart/form-data 才能完整地传递文件数据。
</form>
后台 commons-fileupload的使用
首先需要导入第三方 jar 包,http://commons.apache.org/ 下载
commons-io 和 commons-fileupload 两个 jar 的资源。解压并导入到项目中。
commons-fileupload.jar是文件上传的核心包 commons-io.jar 是 filefupload 的
依赖包,同时又是一个工具包。
DiskFileItemFactory–设置磁盘空间,保存临时文件。只是一个工具类
ServletFileUpload–文件上传的核心类,此类接收 request,并解析
ServletFileUpload.parseRequest(request);– List 解析 request
1、创建一个DiskFileItemFactory 工厂类,并制定临时文件和大小
2、创建ServletFileUpload 核心类,接收临时文件,做请求的转换
3、通过ServletFileUpload 类转换原始请求,得到 FileItem 集合
4、遍历集合中的各个元素并处理
5、判断每个元素是否是普通表单项,如果是则按照普通表单项处理
6、如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)
超链接下载
当我们在 HTML 或 JSP 页面中使用标签时,原意是希望能够进行跳转,但
当超链接遇到浏览器不识别的动态网页时则会自动下载。例如超链接下载但当遇
见浏览器能够直接显示的资源,浏览器就会默认显示出来,比如 txt,png,jpg 等。
当然我们也可以通过 download 属性规定浏览器进行下载。但有些浏览器并不支
持。
默认下载
超链接下载</a>
指定download属性下载
超链接下载</a>
这里,download 也可以不写任何信息,会自动使用默认文件名。这样当用
户打开浏览 器点击链接的时候就会直接下载文件。
后台实现下载
Step1:需要通过 HttpServletResponse.setContentType 方法设置 Content-type
头字段的值,为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,
例如”application/octet-stream”或”application/x-msdownload”等
Step2:需要通过 HttpServletResponse.setHeader 方法设置
Content-Disposition头的值为”attachment;filename=文件名”
Step3: 读取下载文件,调用 HttpServletResponse.getOutputStream 方法返回
的 OutputStream 对象来向客户端写入附件内容。
public class
DownloadServlet extends HttpServlet {
private static
final long serialVersionUID = 1L;
protected void
service(HttpServletRequest req, HttpServletResponse resp)
throws
ServletException, IOException {
req.setCharacterEncoding("UTF-8");
// 获取文件下载路径
String path =
getServletContext().getRealPath("/") + "download/";
String fileName
= req.getParameter("filename");
File file = new
File(path + fileName);
if (file.exists())
{
// 设置相应类型 application/octet-stream
resp.setContentType("application/x-msdownload");
// 设置头信息
resp.setHeader("Content-Disposition",
"attachment;filename=" +
fileName);
InputStream is =
new FileInputStream(file);
ServletOutputStream
os = resp.getOutputStream();
byte[] car = new
byte[1024];
int len = 0;
while ((len =
is.read(car)) != -1) {
os.write(car, 0,
len);
}
// 关闭流、释放资源
os.close();
is.close();
} else {
System.out.println("文件不存在,下载失败!");
}
}
}