Servlet多文件上传入门实例
2016-12-25 11:21
387 查看
先上效果:
为了尽可能让代码简单,逻辑清晰,所以对界面并没有美化,也没有添加图片上传预览功能,如果有兴趣的可以参考我之前写的文件上传预览实现博客。选择文件界面:
上传成功界面:
控制台输出界面:
文件保存界面
代码结构
项目结构截图需要文件只有四个,index.jsp(上传界面)、web.xml(配置映射路径)、RecieveServlet(实现上传逻辑)、pom.xml(项目依赖jar包引入)
各文件代码
index.jsp
<%@ page pageEncoding="utf-8"%> <html> <body> <h2>Hello World!</h2> <meta charset="utf-8"> <form action="/file_upload" method="post" enctype="multipart/form-data"> <label>文件上传</label> <input type="file" name="img"> <input type="file" name="img"> <input type="submit" value="提交"> </form> </body> </html>
web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>RecieveServlet</servlet-name> <description>这是测试多文件上传和存储的servlet实例</description> <servlet-class>com.star.servlet.RecieveServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RecieveServlet</servlet-name> <url-pattern>/file_upload</url-pattern> </servlet-mapping> </web-app>
RecieveServlet类
package com.star.servlet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.List; import java.util.ListIterator; import java.util.UUID; /** * Created by hp on 2016/12/23. */ public class RecieveServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //当文件较大时,不能放在内存中,应该放在一个临时文件夹里面 String tepdir=getServletContext().getRealPath("/temp"); //DiskFileItemFactory:将请求消息实体中的每一个项目封装成单独的DiskFIleItem对象 //第一个参数:上传文件的缓存最大值,当大于这个值的时候就存入临时目录 //第二个参数:设置缓存文件的目录 DiskFileItemFactory factory =new DiskFileItemFactory(1024*1024,new File(tepdir)); //文件上传处理类 ServletFileUpload upload=new ServletFileUpload(factory); try { //parseRequest方法解析Request中的文件,并返回FileItem列表 List<FileItem> list=upload.parseRequest(request); //创建一个迭代器,用来迭代多个FileItem对象 ListIterator<FileItem> iterator=list.listIterator(); //临时容纳单个fileItem FileItem item; String fileName; int index; while (iterator.hasNext()){ //获得下一个item文件对象 item=iterator.next(); //获取文件名 fileName=item.getName(); System.out.println(fileName); //分离文件名后缀,如.jpg index=fileName.indexOf("."); //substring 方法会返回下标为index之后的字符串 fileName=fileName.substring(index); System.out.println(fileName); //使用UUID类重新生成一个随机的文件名(防止文件名重复),记住要加上文件后缀 fileName=UUID.randomUUID().toString()+fileName; System.out.println(fileName); //多级文件存储目录,以日期划分,这样可以分流 String dir="/2016/12/25"; //getServletContext().getRealPath方法会自动获取并在 // 最前面加上当前项目的根路径 String path=getServletContext().getRealPath("upload/"+dir); System.out.println(path); //新建文件目录 File pathFile=new File(path); //如果文件夹不存在,则创建文件夹 Boolean b=null; if (!pathFile.exists()){ //返回值是bollean类型,true则表示创建目录成功 //mkdirs方法或自动创建多级目录,而mkdir则只会创建一层 b= pathFile.mkdirs(); } System.out.println(b); /* * 将文件写入磁盘 * @param pathFile 文件存储的路径 * @param fileName 存储的文件名 */ item.write(new File(pathFile,fileName)); response.getWriter().write("恭喜你,文件上传成功!"); } //parseRequest抛出的异常 } catch (FileUploadException e) { e.printStackTrace(); //方法item.write抛出的异常 } catch (Exception e) { e.printStackTrace(); } } }
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.star</groupId> <artifactId>Img_up_save</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>Img_up_save Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> </dependencies> <build> <finalName>Img_up_save</finalName> </build> </project>
代码解说
servlet类中的每一行代码我都尽可能做了注释,要解释的都在注释里解释了,有疑问的小伙伴可以留言。反思总结
别人的项目只有参照价值,终究还是要自己动手去实现一遍才能真正掌握,所以建议想要学习小伙伴们一定要建一个小项目自己动手实现一下,实现了过后你的项目就可以作为独立模块添加到其他项目里了。项目源码github克隆地址:git@github.com:Dodozhou/ImgsUploadAndSave.git
相关文章推荐
- Pylons 入门实例教程 – 表单和文件上传
- Android中发送Http请求实例(包括文件上传、servlet接收)
- Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门
- Servlet 3.0文件上传实例
- PHP入门教程之上传文件实例详解
- Android之Http请求实例(文件上传+servlet接收)
- Servlet3.0 上传文件实例
- 36、Java入门—Socket实例之客户端向服务端数据库上传文件UI版
- web入门-servlet 3.0注解 文件上传
- SpringMVC中使用StandardServletMultipartResolver上传文件实例
- Android中发送Http请求实例(包括文件上传、servlet接收)
- php的文件上传入门教程(实例讲解)
- Android中发送Http请求(包括文件上传、servlet接收)的实例代码
- Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门
- Flex+Java Servlet文件上传实例
- Android中发送Http请求实例(包括文件上传、servlet接收)
- Android中发送Http请求实例(包括文件上传、servlet接收)
- php的文件上传入门教程(实例讲解)
- Servlet3.0学习总结之基于Servlet3.0的文件上传实例
- PHP入门教程之上传文件实例详解