pom.xml导包 lib更新
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId> <version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
1.客户端上传文件的jsp页面中
上传文件夹的form标签注意 enctype="multipart/form-data"> <input type="file"
<form action="user/fileupload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传文件"/>
</form>
web.xml把上传文件请求发到服务端的方法中 处理流程
- 判断上传的数据是不是多段数据(多段数据才是文件)
- 创建工厂实现类
- 创建解析上传数据的工具类对象 对象调用parseRequest(req)方法解析文件返回表单项的集合 抛异常
- 对于解析方法返回的表单项集合要去判断表单项是普通表单项还是上传文件的表单项 用isFormFiled()方法 判断
- 如果是上传文件表单项 我们就把上传的文件保存到具体的磁盘位置
fileItem.write
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("文件上传请求已被服务端接收....待服务端行动");
//判断是否是多段数据
if(ServletFileUpload.isMultipartContent(req))
{ //创建表单项的工厂
FileItemFactory factory=new DiskFileItemFactory();
//解析上传数据的工具类
ServletFileUpload servletFileUpload=new ServletFileUpload(factory);
List<FileItem> fileItems=null;
try {
//解析返回表单项集合
fileItems= servletFileUpload.parseRequest(req);
} catch (Exception e) {
e.printStackTrace();
}
//遍历表单项
for(FileItem fileItem: fileItems)
{ // 判断文件项是普通字段,还是上传的文件
if(fileItem.isFormField())//普通的表单项
{
}else
{
String fileName=fileItem.getName();
try {
fileItem.write(new File("E:\\"+fileName));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
文件的下载 直接访问url即可 不用什么页面
-
目前这个老师写的file是直接在Web目录下创建的 通常我们都是在WEB-INF下面创建 所以一般写成
"/WEB-INF/file/"
-
所以index.jsp在跳转的时候写成/index.jsp
是http://ip地址端口号/项目别名(模块别名)/代码的Web目录/index.jsp
-
${PageContex.request.ContextPath}/user/login
前面这些也是
http://ip地址端口号/项目别名(模块别名)/user/login
http://ip地址端口号/项目别名(模块别名)/Servlet的URL
在web的WEB-INF下的文件客户端没有权限访问 只有服务器段有权限
我们把客户想要下载的文件放在web-inf下面
控制器中的方法是
1.获取要下载的文件名
2.获取ServletContext对象
3.在回传之前 通过响应头告诉客户端返回的数据类型(下载的文件类型)是什么
4.使用响应头 告诉客户端当前的数据是用于下载的
resp.setHeader("Content-Disposition","attachment; filename="+fileName);
Context-Disposition:内容处理 如何处理呢?
attachment:表示附件 说明是下载处理
filename:后面接着文件名(客户端下载的时候显示给客户的文件名)
- 真正传给客户端
- 通过ServletContext对象读取web-inf下面的文件返回字节流
- resp调用getOutputStream()方法 获取响应给客户端的输出字节流
- commons包封装的IOUtils.copy() 把ServletContext对象读取文件返回的字节流 复制给 响应输出流传给客户端
以上5步顺序不可改
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String fileName="a.jpg";
//获取serverletCOntex对象
ServletContext servletContext=getServletContext();
//通过响应头设置回传文件类型
String mimeType = servletContext.getMimeType("/images/" + fileName);
resp.setContentType(mimeType);
//通过响应头告诉客户端文件是可下载的
resp.setHeader("Content-Disposition","attachment; filename="+fileName);
//真正的将解析文件字节流赋值到响应的输出流中
InputStream resourceAsStream = servletContext.getResourceAsStream("/WEB-INF/images/" + fileName);
ServletOutputStream outputStream = resp.getOutputStream();
IOUtils.copy(resourceAsStream,outputStream);
}
IE/谷歌 对于服务器写给客户端的中文无法识别 会乱码
编码
resp.setHeader
("Content-Disposition","attachment; filename==?UTF-8?B?"
+new BASE64Encoder().encode("中国.jpg".getBytes("UTF-8"))+"?=");
所以现在IE/火狐不兼容
判断请求是从什么浏览器发出
请求头的User-Agent
是包含浏览器信息的