文件上传操作
a.jsp表单提交页面注意事项(3个属性需要注意)
1.enctype="multipart/form-data":
普通表单提交默认enctype="application/x-www-form-urlencoded";但是当表单中存在文件类型时,需要设置enctype="multipart/form-data",
它不对字符进行编码,用于发送二进制的文件(即所有文件类型,如视频、图片、音乐、文档都可以用此类型enctype);还有一种enctype="text/plain"用于发送纯文本内容。
2.method="post":
表单请求方式必须为post。
3.input type="file":
文件表单内容的类型应设置为为文件类型。
b.设置指定上传目录应注意的问题(tomcat中上传目录丢失问题)
a.若将上传目录放在tomcat目录
1.如果修改代码,则在tomcat重新启动时,会被删除。
原因:当修改代码的时候,tomcat会重新编译一份class并且重新部署(重新创建各种目录)
2.如果不修改代码,则不会删除
原因:没有修改代码,class仍然时之前的class
b.为防止上传目录丢失:
1.将上传目录部署到非tomcat目录即可(推荐做法)
2.使用虚拟路径来部署上传目录
c.使用fileUpload固定步骤:
1.创建工厂类:DiskFileItemFactory factory=new DiskFileItemFactory();
2.创建解析器:ServletFileUpload upload=new ServletFileUpload(factory);2.
3.使用解析器解析request对象:List list=upload.parseRequest(request);
一个FileItem对象对应一个表单项。FileItem类有如下方法:
String getFieldName():获取表单项的name的属性值。
String getName():获取文件字段的文件名。如果是普通字段,则返回null
String getString():获取字段的内容。如果是普通字段,则是它的value值;如果是文件字段,则是文件内容。
String getContentType():获取上传的文件类型,例如text/plain、image。如果是普通字段,则返回null。
long getSize():获取字段内容的大小,单位是字节。
boolean isFormField():判断是否是普通表单字段,若是,返回true,否则返回false。
InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回value值的输入流。
d.使用fileUpload组件实现文件上传除了上面的那些方法之外还要注意的:
文件名中文乱码处理:servletFileUpload.setHeaderEncoding(“utf-8”) 或 request.setCharacterEncoding(“utf-8”);
表单普通字段中文乱码处理:new String(str.getBytes(“iso-8859-1”,“utf-8”));
设置内存缓冲区的大小,默认为10KB:diskFileItemFactory.setSizeThreshold(10241024);
指定临时文件目录,如果单个文件的大小超过内存缓冲区,该文件将会临时缓存在此目录下:diskFileItemFactory.setRepository(file);
设置单个文件大小限制,如果有某个文件超过此大小,将抛出FileUploadBase.FileSizeLimitExceededException:servletFileUpload.setFileSizeMax(1024102410);
设置所有文件,也就是请求大小限制,如果文件总和超过此大小,将抛出FileUploadBase.SizeLimitExceededException:servletFileUpload.setSizeMax(10241024*20);
利用UUID生成伪随机字符串作为文件名避免重复:UUID.randomUUID().toString();
将文件写到硬盘上。写完之后,系统会自动将放在临时文件目录的该文件删除:fileItem.write(new File(path,fileName));
应用实例:在jsp页面写一个表单,将该表单提交到servlet中实现文件上传操作
1.文件上传需要用到的jar包,导入以下两个jar包到目录WebContent下的WEB-INF的lib文件夹中,选中这两个jar包:右键build path—>点击add build path
commons-fileupload.jar包
commons-io.jar包
2.在目录WebContent下创建一个jsp页面
upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 注意事项:1.method="post" 2.enctype="multipart/form-data" 3.input type="file"-->
<form action="UploadServlet" enctype="multipart/form-data"
method="post">
用户名:<input type="text" name="username"> <br>
密码:<input type="password"name="pwd"> <br>
选择你需要上传的文件<input type="file" name="pic"> <br>
<input type="submit" value="上传">
</form>
</body>
</html>
3.创建包com.xiaochen.servlet,在该包创建UploadServlet
UploadServlet.java
package com.xiaochen.servlet;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadServlet
*/
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DiskFileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
request.setCharacterEncoding("utf-8");
//文件名中文乱码处理也可以如此写
// upload.setHeaderEncoding("utf-8");
//设置缓冲区大小与临时文件目录
factory.setSizeThreshold(1024*1024*10);
//我将临时的文件目录设置在d盘的test_upload文件夹
File uploadTemp=new File("d:\\test_uploadtemp");
uploadTemp.mkdirs();
factory.setRepository(uploadTemp);
//设置单个文件大小限制
upload.setFileSizeMax(1024*1024*10);
//设置所有文件总和大小限制
upload.setSizeMax(1024*1024*30);
try {
List<FileItem> list=upload.parseRequest(request);
System.out.println(list);
for (FileItem fileItem:list){
if (!fileItem.isFormField()&&fileItem.getName()!=null&&!"".equals(fileItem.getName())){
String filName=fileItem.getName();
//利用UUID生成伪随机字符串,作为文件名避免重复
String uuid= UUID.randomUUID().toString();
//获取文件后缀名
String suffix=filName.substring(filName.lastIndexOf("."));
//获取文件上传目录路径,在项目部署路径下的upload目录里。若想让浏览器不能直接访问到图片,可以放在WEB-INF下
//String uploadPath=request.getSession().getServletContext().getRealPath("/upload");
//定义文件路径:指定上传的位置
String uploadPath="D:\\test_upload";
File file=new File(uploadPath);
file.mkdirs();
//写入文件到磁盘,该行执行完毕后,若有该临时文件,将会自动删除
fileItem.write(new File(uploadPath,uuid+suffix));
//上传成功提示
response.setCharacterEncoding("GBK");
response.getWriter().println("上传成功!!!");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
/*
//提前设置好编码格式,避免乱码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
//文件上传
boolean isMutipart=ServletFileUpload.isMultipartContent(request);
//判断前台form是否有mutipart属性
if(isMutipart) {
try {
FileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
//通过parseRequest解析form中的所有请求字段,并保存到items集合中
List<FileItem> items=upload.parseRequest(request);
//遍历items中的数据(u_id,u_name,u_file)
Iterator<FileItem> iter=items.iterator();
while(iter.hasNext()) {
FileItem item=iter.next();
//获取表单字段的name值
String itemName=item.getFieldName();
int u_id=-1;
String u_name=null;
//request.getParameter() -----> iter.getString()
//判断前台字段是普通form表单字段(u_id,u_name),还是文件字段
if(item.isFormField()) {
//根据name属性判断item是u_id还是u_name
if(itemName.equals("u_id")) {
u_id=Integer.parseInt(item.getString("UTF-8"));
}else if(itemName.equals("u_name")) {
u_name=item.getString("UTF-8");
}else {
System.out.println("其他字段。。。");
}
}
//是文件字段
else {
//获取文件的name值
String fileName=item.getName();
//获取文件内容并上传
//定义文件路径:指定上传的位置
String path="D:\\test_upload";
File file=new File(path,fileName);
//文件上传
item.write(file);
System.out.println(fileName+"上传成功!!!");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
*/
}
}
运行结果图
上传前
上传后