文件上传功能实现(一)
文件上传:
①上传前的准备工作(准备一个注册的表单页面)
创建一个文件上传的控件,点击这个控件就可以选择需要上传的文件了
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="headimg" />
注意:上传时表单的上传类型必须是:multipart/form-data
上传的method必需是POST
当设置了multipart/form-data的时候,就不会对字符进行编码了,而Servlet中拿到的值与数据必需是经过
编码的值,所以要解决这个问题,就需要对上传的东西进行字符编码.
②准备一个上传的Servlet,到后台接收传过来的普通表单数据 与 文件(二进制)
③导入相应的FileUpload jar包 (commons-fileupload-1.2.2.jar ,commons-io-1.4.jar)
这两个包的作用,前者可以让我们通过教程学会文件的上传功能实现,后面的这个包里面的
FilenameUtils 里面得工具可以帮我们完善这个文件上传的功能修复BUG
④使用jar包
打开jar包找到index.html
小提示:在首页总有一个开发指南(User Guide)或者快速上手(Quick Start )等着你
⑤根据快速入门解析完成一个文件上传的功能
代码:
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个工厂解析这个请求,得到的是一个集合,这个集合装的就是一个请求对象,封装的就是每一条请求数据
try {
// 创建一个工厂
FileItemFactory factory = new DiskFileItemFactory();
// 创建一个文件上传的处理器
ServletFileUpload upload = new ServletFileUpload(factory);
//解析这个请求:解析完之后咱们可以拿到一个FileItem的集合
List < FileItem > items = upload.parseRequest(req);
//通过遍历集合可以拿到上传的文件的属性值,包括属性名,值..
for (FileItem fileItem : items) {
//上面的测试可以看输出,普通控件和file控件的处理方式是要区别对待的
if(fileItem.isFormField()){
//代表是一般表单,用一般表单的处理方式解决即可
}else{
//拿到上传文件的名称(有ie版本问题)
//String upname=fileItem.getName();
//有重名文件上传的问题
String upname = FilenameUtils.getName(fileItem.getName());
//有保存路路径的问题有的操作系统没有盘符
File uploadFile = new File("D:/",upname);
//将本地的文件写到服务器中
fileItem.write(uploadFile);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个工厂解析这个请求,得到的是一个集合,这个集合装的就是一个请求对象,封装的就是每一条请求数据
try {
// 创建一个工厂
FileItemFactory factory = new DiskFileItemFactory();
// 创建一个文件上传的处理器
ServletFileUpload upload = new ServletFileUpload(factory);
//解析这个请求:解析完之后咱们可以拿到一个FileItem的集合
List < FileItem > items = upload.parseRequest(req);
//通过遍历集合可以拿到上传的文件的属性值,包括属性名,值..
for (FileItem fileItem : items) {
//上面的测试可以看输出,普通控件和file控件的处理方式是要区别对待的
if(fileItem.isFormField()){
//代表是一般表单,用一般表单的处理方式解决即可
}else{
//拿到上传文件的名称(有ie版本问题)
//String upname=fileItem.getName();
//有重名文件上传的问题
String upname = FilenameUtils.getName(fileItem.getName());
//有保存路路径的问题有的操作系统没有盘符
File uploadFile = new File("D:/",upname);
//将本地的文件写到服务器中
fileItem.write(uploadFile);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
说明:这个只能实现本地上传,还有许多bug需要修复,在后面会有详细的解决方案