大家好,欢迎来到IT知识分享网。
1、文件上传代码所依赖的jar包:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
2、在JSP中编写表单代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%-- 千万不能忘记 enctype="multipart/form-data" --%>
<form action="${pageContext.request.contextPath}/uploadFile.do" method="post" enctype="multipart/form-data" >
<input type="text" name="name" value="姓名"> <br>
<input type="file" name="file1"><br>
<input type="file" name="file2"><br>
<input type="text" name="address" value="住址"><br>
<input type="submit">|<input type="reset">
</form>
</body>
</html>
3、创建对应的servlet类 用于处理请求 , 并在web.xml中注册servlet
<servlet>
<servlet-name>UploasFile</servlet-name>
<servlet-class>com.pqw.servlet.UploadFile</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploasFile</servlet-name>
<url-pattern>/uploadFile.do</url-pattern>
</servlet-mapping>
4、编写servlet类代码
4.1、创建上传文件保存在网站的路径
// 处理编码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
// 创建文件上传路径
String realPath = this.getServletContext().getRealPath("WEB-INF/upload");
System.out.println("realPath"+realPath);
File uploadFile = new File(realPath);
// 路径不存在 则创建文件夹
if (!uploadFile.exists()){
uploadFile.mkdir();
}
4.2、创建大文件临时保存路径
// 创建文件临时存放路径
String tempPath = this.getServletContext().getRealPath("WEB-INF/temp");
File tempFile = new File(tempPath);
if (!tempFile.exists()){
tempFile.mkdir();
}
4.3、创建DiskFileItemFactory对象
// 创建DiskFileItemFactory对象
DiskFileItemFactory factory = new DiskFileItemFactory();
4.4、 创建ServletFileUpload对象
// 创建ServletFileUpload对象
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
4.5、将前端的请求解析为FileItem对象,并处理每个Item对象
// 将前端的请求解析为FileItem对象
List<FileItem> fileItems=null;
try {
fileItems = servletFileUpload.parseRequest(req);
} catch (FileUploadException e) {
e.printStackTrace();
}
// 处理前端发送过来每个表单控件被封装成FileItem对象
for (FileItem fileItem : fileItems) {
// 判断表单控件是文件表单还是普通表单
if (fileItem.isFormField()){
// 获取普通表单控件的值
String name = fileItem.getFieldName();
String value = fileItem.getString("UTF-8");
System.out.println(name+" : "+value);
}else {
// 处理上传的文件
String uploadFileName = fileItem.getName();
System.out.println("uploadFileName: "+uploadFileName);
if (uploadFileName.trim().equals("") ||uploadFileName==null){
continue;
}
// 获取文件名
String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/" )+ 1);
// 使用UUID 保证文件名唯一性 避免文件被覆盖
UUID uuid = UUID.randomUUID();
// 为每个上传的文件创建一个单独的uuid文件夹
String uploadPath = realPath+"/"+uuid;
File uuidFilePath = new File(uploadPath);
if (!uuidFilePath.exists()){
uuidFilePath.mkdir();
}
// 获取文件输入流
InputStream inputStream = fileItem.getInputStream();
// 创建文件输出流
FileOutputStream outputStream = new FileOutputStream(uploadPath+"/"+fileName);
byte[] buffer = new byte[1024 * 1024];
int length=0;
// 将流写入文件
while ((length=inputStream.read(buffer))>0){
outputStream.write(buffer,0,length);
}
// 关闭资源
outputStream.close();
outputStream.close();
req.setAttribute("message","文件上传成功!");
}
}
*到这里文件上传功能是可以实现了~~~~*
上传的文件目录实在项目打的包文件夹下
5、关于文件上传的几个注意点:
5.1、上传的文件中我们一般放在外界无法直接访问的目录下(例如WEB-INF目录),保证网站的安全性;
5.2、要考虑用户上传文件重名问题,需要给每个文件形成一个唯一的文件名。常用方法有UUID、MD5、文件名末尾添加时间戳、位运算算法等…
5.3、要限制上传文件的最大值,避免恶意用户恶意占用磁盘资源;
5.4、要限制可上传文件类型,并检验后缀名的合法性.
对于文件重名问题,我使用的方法是:使用UUID类为每个文件创建一个唯一命名的的文件夹,将文件放在改目录下。
UUID类是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符,对原理感兴趣的小伙伴可以单独去搜搜,这里不在赘述~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/21796.html