值 | 描述 |
---|---|
application/x-www-form-urlencoded | 在发送前编码所有字符(默认) |
multipart/form-data | 不对字符编码。每一个表单项分割为一个部件 |
text/plain | 空格转换为 “+” 加号,但不对特殊字符编码。 |
通过观察发现这个的请求体就发生了变化。这种请求体被称之为多部件请求体。 什么是多部件请求体:就是把每一个表单项分割为一个部件。 以请求头的content-type的boundary后面的一串随机字符串作为分割标识 普通表单项:
//name的意思是文本框里面name的属性值,而admin是我们输入的文本值
Content-Disposition: form-data; name="username"
admin
文件表单项
//filename的意思是:我们上传的文件名称,content-Type的意思是:MIME类型,asdasdas的意思是:文件里面的内容
Content-Disposition: form-data; name="upload"; filename="a.txt"
Content-Type: text/plain
asdasdas
w3c称:空格会变成”+”加号,但是我这里没有发现,只有当get请求的时候,空格会变成”+”号
完成上传需要满足3个必要的条件
准备两个第三方jar包 commons-io包 commons-upload包
代码实现
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 判断表单的enctype值是不是"multipart/form-data"
boolean isMultipartContent = ServletFileUpload
.isMultipartContent(request);
if (!isMultipartContent) {
throw new RuntimeException("your form is not multipart/form-data");
}
// 创建一个DiskFileItemfactory工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建一个ServletFileUpload核心对象
ServletFileUpload sfu = new ServletFileUpload(factory);
// 解析request对象,并得到一个表单项的集合
try {
List<FileItem> fileItems = sfu.parseRequest(request);
// 遍历表单项数据
for (FileItem fileitem : fileItems) {
if (fileitem.isFormField()) {
// 普通表单项
String fieldName = fileitem.getFieldName();
String fieldValue = fileitem.getString();
System.out.println(fieldName + "=====" + fieldValue);
} else {
//上传表单项
//得到文件输入流
InputStream is = fileitem.getInputStream();
//创建文件存储目录
String directoryRealPath = this.getServletContext().getRealPath("WEB-INF/upload");
//创建文件路径
File storeDirectory = new File(directoryRealPath + File.separator + fileitem.getName());
//使用apache commons-io包,将输入流转成文件
FileUtils.copyInputStreamToFile(is, storeDirectory);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
两个头一个流
下载就是向客户端响应字节数据! 将一个文件变成字节数组, 使用 response.getOutputStream() 来响应给浏览器。
// 下载
public class DownloadServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException{
//根据文件名获取 MIME 类型
String contentType = this.getServletContext().getMimeType("测试.xls");
//设置content-Type头
response.setHeader("Content-Type",contentType);
//解决下载框为中文名称出现乱码问题
String fileName;
//获取用户浏览器
String agent=request.getHeader("user-agent")
// 火狐浏览器
if (agent.contains("Firefox")) {
filename = "=?UTF-8?B?"
+ new BASE64Encoder().encode(filename.getBytes("utf-8"))
+ "?=";
filename = filename.replaceAll("\r\n", "");
// IE及其他浏览器
} else {
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+"," ");
}
//设置Content-Disposition头
resp.setHeader("Content-Disposition","attachment; filename=" + filename + "");
// 输入流
FileInputStream fis= new FileInputStream("文件路径");
// 获取输出流
ServletOutputStream output = response.getOutputStream();
// 把输入流中的数据写入到输出流中
byte[] b = new byte[fis.available()];
fis.read(b);
//输出
output .write(b);
output .flush();
}
}