第一步:书写测试html,其中enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
<textarea readonly="readonly" name="code" class="html">
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="post" action="upload" Enctype="multipart/form-data">
姓名:<input type="text" name="name"/><br/><br/>
年龄:<input type="text" name="age"/><br/><br/>
上传 <input type="file" name="file"/><br/><br/>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
</body>
</html>
</textarea>
第二步:配置<servlet></servlet>,其中<multipart-config>中配置上传文件的参数
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>HST</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.hts.servlet.ServletTest</servlet-class>
<multipart-config>
<max-file-size>51200</max-file-size>
<max-request-size>52224</max-request-size>
<file-size-threshold>4096</file-size-threshold>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
</web-app>
第三步:书写测试类
1.创建一个测试类,并继承HttpServlet类,重写弗雷中的doPost方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
String age = req.getParameter("age");
resp.getWriter().write("name:" + name + "<br/>" + "age:" + age);
Part part = req.getPart("file");
upSave(part);
resp.getWriter().write("<strong>上传成功!</Strong>");
}
2.写一个解析上传文件头部的方法,获得文件名称,并返回
private String getFileName(Part part) {
String header = part.getHeader("content-disposition");
String[] headerNames = header.split("filename=");
return headerNames[headerNames.length - 1].replaceAll("\"", "");
}
3.写一个保存上传文档的方法,通过输入输出流完成上传文件
private void upSave(Part part) throws IOException {
String fileName = getFileName(part);
fileName = "hst" + System.nanoTime() + fileName;
ServletContext servletContext = getServletContext();
String path = servletContext.getRealPath("/");
File file = new File(path + "upload");
if (!file.exists()) {
file.mkdirs();
}
File newFile = new File(file, fileName);
FileOutputStream fos = null;
InputStream fip = null;
byte[] buf = new byte[1024];
int flag = 0;
try {
fos = new FileOutputStream(newFile);
fip=part.getInputStream();
while ((flag=fip.read(buf, 0, 1024))!=-1) {
fos.write(buf, 0, flag);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fos!=null) {
fos.close();
}
if (fip!=null) {
fip.close();
}
}
}
测试类整体代码
package com.hts.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
public class ServletTest extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
String age = req.getParameter("age");
resp.getWriter().write("name:" + name + "<br/>" + "age:" + age);
Part part = req.getPart("file");
upSave(part);
resp.getWriter().write("<strong>上传成功!</Strong>");
}
private void upSave(Part part) throws IOException {
String fileName = getFileName(part);
fileName = "hst" + System.nanoTime() + fileName;
ServletContext servletContext = getServletContext();
String path = servletContext.getRealPath("/");
File file = new File(path + "upload");
if (!file.exists()) {
file.mkdirs();
}
File newFile = new File(file, fileName);
FileOutputStream fos = null;
InputStream fip = null;
byte[] buf = new byte[1024];
int flag = 0;
try {
fos = new FileOutputStream(newFile);
fip=part.getInputStream();
while ((flag=fip.read(buf, 0, 1024))!=-1) {
fos.write(buf, 0, flag);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fos!=null) {
fos.close();
}
if (fip!=null) {
fip.close();
}
}
}
private String getFileName(Part part) {
String header = part.getHeader("content-disposition");
String[] headerNames = header.split("filename=");
return headerNames[headerNames.length - 1].replaceAll("\"", "");
}
}