您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: