介绍
上传文件是最常用的功能之一,如网购评论时要发图片,报考网站要上传个人信息等
实现html
创建 upload.jsp,关键内容如下:
<form method="post" enctype="multipart/form-data" action="upload">
上传图片:<input type="file" name="img"><br>
描述:<input type="text" name="descrip"><br>
<input type="submit">
</form>
关键:
method="post"
必须是post
方法enctype="multipart/form-data"
:enctype 是表单请求正文的类型,上传文件必须设置,表示以 流 的方式将数据发送给服务器<input type="file" name="img">
:上传文件控件,注意名字
相关类和方法
获取 Part
接口对象:req.getPart("img")
Part
接口,通过该接口获取上传文件相关信息
获取上传文件名:head.getSubmittedFileName()
获取文件大小:head.getSize()
写入到指定位置:head.write()
实现Servlet
有缺点:不能上传同名文件
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Part head = req.getPart("img");
if(head!=null) {
// 上传文件才执行下面代码
if(head.getSubmittedFileName()!=null && !"".equals(head.getSubmittedFileName())) {
// 在当前工程下创建upload文件夹
// upload文件夹的绝对路径(全路径)
String upload = req.getServletContext().getRealPath("/upload");
File uploadFile = new File(upload);
if (!uploadFile.exists()) {
// 创建文件夹
uploadFile.mkdirs();
}
String uuid = UUID.randomUUID().toString().replace("-", "");
//截取文件后缀
// 拼装,uuid+文件后缀
// 拼装的是保存上传文件的全路径
File file = new File(uploadFile, head.getSubmittedFileName());
// 保存
head.write(file.getAbsolutePath());
//文件名称
System.out.println(head.getSubmittedFileName());
//文件大小
System.out.println(head.getSize());
}
}
// 通过request对象获取浏览器提交的参数
String username = req.getParameter("descrip");
}
web.xml 配置
<servlet>
<servlet-name>RegistServlet</servlet-name>
<servlet-class>com.boda.servlet.RegistServlet</servlet-class>
<!-- 必须加此配置,否则不生效 -->
<multipart-config>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>RegistServlet</servlet-name>
<url-pattern>/reg</url-pattern>
</servlet-mapping>
其他配置
在 <multipart-config>
标签中还可以配置下面内容:
<file-size-threshold></file-size-threshold> 接收数据大于该值时,将缓存数据写入到文件中
<location></location> 保存位置
<max-file-size></max-file-size> 允许上传文件的最大大小,默认为-1,无限制,单位:byte
<max-request-size></max-request-size> 请求的最大数量,默认为-1,无限制,单位:byte