一.文件上传
1.注意:
-
jsp提交方式必须为post
-
必须采用复杂格式 : enctype=“multipart/form-data”
<form action="/upload" method="post" enctype="multipart/form-data">
-
需要commons-fileupload.jar来解析multipart/form-data格式,并且要依赖commons-io.jar
2.代码如下:
update.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<p> 姓名<input type="text" name="name"></p>
<p><input type="file" name="img"> ${requestScope.error}</p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
UpdateServlet:
@WebServlet(urlPatterns = "/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//提前创建存储图片的目录
new File("e:\\images").mkdirs();
//将上传的文件存入服务器磁盘的一个工具类
DiskFileItemFactory factory = new DiskFileItemFactory();
//核心文件上传工具类
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setSizeMax(1024*1024);
try {
//list对应表单的数据集合,其中每一项抽象为了FileItem(文本框,文件,复选框...)
List<FileItem> list = fileUpload.parseRequest(req);
//遍历集合
for (FileItem item : list) {
//如果是普通表单选项
if(item.isFormField()){
System.out.println("参数名:"+item.getFieldName());
System.out.println("值:"+item.getString("UTF-8"));
}else {
//否则不是一个普通表单项,是一个文件
System.out.println("得到文件长度:"+item.getSize());
if(item.getSize()>0){
System.out.println("文件的原始名:"+item.getName());
item.write(new File("e:\\images\\"+item.getName()));
}
}
System.out.println("===============================");
}
}
catch (FileUploadBase.SizeLimitExceededException e) {
req.setAttribute("error", "上传的文件超过了大小限制");
req.getRequestDispatcher("/upload.jsp").forward(req, resp);
}
catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二.文件下载
1.DownloadServlet代码:
@WebServlet(urlPatterns = "/download/*")
public class DownloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1) 当响应的 content-type 设置为image,浏览器会显示图片
resp.setContentType("image/jpg");
// 2) 如果要把图片进行下载操作
resp.setContentType("application/octet-stream");//二进制流,当不知道下载文件的类型是用
//让浏览器默认下载而非展现这张图,并且以1.jpg的名字保存。
resp.addHeader("content-disposition","attachment;filename=new.jpg");
// 把【浏览器的路径】 转换为 【服务器的磁盘路径】
String uri = req.getRequestURI(); // 获取浏览器实际输入路径
System.out.println(uri);
String path = "E:\\" + uri;// 图片的磁盘路径
// 如果文件不存在,返回404
if( !new File(path).exists() ) {
resp.sendError(404);
return;
}
// 如果存在,从文件输入流读取,向响应的输出流写
FileInputStream is = new FileInputStream(path);
OutputStream os = resp.getOutputStream();
IOUtils.copy(is, os);
IOUtils.closeQuietly(is);
}
}
2.注意:上述代码中有如下一段代码
// 2) 如果要把图片进行下载操作
resp.setContentType("application/octet-stream");//二进制流,当不知道下载文件的类型是用
//让浏览器默认下载而非展现这张图,并且以1.jpg的名字保存。
resp.addHeader("content-disposition","attachment;filename=new.jpg");
二进流不知道文件类型时用application/octet-stream如下图: