(OK)访问引入了jstl页面时候报错。
1.问题介绍
问题介绍1:已经导入了两个jar包
问题介绍2:html表单
问题介绍3:servlet类
问题介绍4:页面发送下载请求
问题介绍5:控制台打印情况
2.问题原因
表单中文件表单项没有加name属性
3.问题解决
1.问题介绍
问题介绍1:已经导入了两个jar包
问题介绍2:html表单
问题介绍3:servlet类
public class FileUpLoadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if (ServletFileUpload.isMultipartContent(req)){
ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
try {
List<FileItem> list = servletFileUpload.parseRequest(req);
for (FileItem fileItem : list) {
if (fileItem.isFormField()){
System.out.println("name的值是:" + fileItem.getFieldName());
System.out.println("value的值是:" + fileItem.getString("UTF-8"));
}else {
System.out.println("name的值是:" + fileItem.getFieldName());
String fileName = "文件名是:" + fileItem.getName();
System.out.println(fileName);
File file = new File("D:\\aaa.jpg");
System.out.println(file.getName());
fileItem.write(file);
}
}
} catch (FileUploadException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
问题介绍4:页面发送下载请求
问题介绍5:控制台打印情况
2.问题原因
表单中文件表单项没有加name属性
3.问题解决
上传下载整个流程
上传下载共同需求:两个依赖
上传
客户端
要求
1. form表单
2. 多段式encType
3. 文件表单项传输
代码
<form action="http://localhost:8888/fileLoadServlet" method="post" enctype="multipart/form-data">
用户名输入:<input type="text" name="username"/><br/>
<input type="file" name="fileUpload" ><br/>
<input type="submit" value="提交"><br/>
</form>
服务端
API
ServletFileUpload将多段数据解析成单项数据FileItem
1. ServletFileUpload:完成上传的类【解析数据】
2. FileItem:多段数据中的一段数据【处理数据】
步骤
1.【上传是多段请求】判断是不是多段请求:isMultipartContent();
2. 解析请求:parseRequest();
new ServletFileUpload(new DiskFileItemFactory()).parseRequest(req);
【需要一个处理数据工厂DiskFileItemFactory】
3. 遍历多段数据,判断是不是普通项:isFormField()
4. 是普通项
FileItem.getFieldName();【获取name属性值】
FileItem.getString("UTF-8");【获取value属性值】
5. 是文件
FileItem.getFieldName();【获取name属性值】
FileItem.getName();【获取文件名】
最后一步:FileItem.write(file);【写到文件中,上传完成】
下载
客户端
发送请求就行,不许要其他操作。
服务端
两步做到下载
1. 显示到页面
2. 通知客户端下载
显示到页面
1. 从文件中获取文件流:【任何字节输入流都可以】
getServletContext().getResourceAsStream("/file/" + fileName);
2. 获取响应输出流:resp.getOutputStream();
3. 输出给客户端
IOUtils.copy(resourceAsStream,outputStream);
这一步做到了两件事:将输入流复制到输出流,将输出流响应给客户端
通知客户端下载
设置文件处理响应头:Content-Disposition
值设置成附件处理:attachment;filename=【自定义文件名】
resp.setHeader("Content-Disposition","attachment;filename="+fileName);
设置响应头 必须在 获取响应输出流 之前
--------------------------------------------------------------------------------------
最后声明:获取到的value值可能乱码,getString("【设置字符集】");