需要用到的jar包:commons-fileupload-1.4.jar和commons-io-2.6.jar
从apache官网下载
1、前端
<%@ 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、提交方式为post
2、提交请求添加multipart/form-data请求
-->
<form action="registerServlet" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
照片:<input type="file" name="photo"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
2、后台
package com.servlets;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
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.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取请求的格式
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//判断请求的格式,若不是指定格式,那么就会抛出异常
if (!isMultipart) {
throw new RuntimeException("当前文件不支持上传!");
}
//若是指定的格式,那么就执行下面代码
try {
//创建一个FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//单位:字节 本例设置边界值为1M
//设置使用临时文件的边界值,大于该值,上传文件会先保存到临时文件中,否则,上传文件直接写入到内存
factory.setSizeThreshold(1024*1024*1);
//设置临时文件
String tempPath = this.getServletContext().getRealPath("/temp");
File temp = new File(tempPath);
factory.setRepository(temp);
//创建文件上传核心组件
ServletFileUpload upload = new ServletFileUpload(factory);
//设置单个上传文件的最大值
upload.setFileSizeMax(1024*1024*2);
//设置所有上传文件总和的最大值
upload.setSizeMax(1024*1024*5);
//保证文件item文件部分是utf-8编码
upload.setHeaderEncoding("utf-8");
//解析请求,获取到所有的item
List<FileItem> items = upload.parseRequest(request);
//遍历items
for (FileItem item : items) {
//item为简单表单项
if(item.isFormField()) {
String fieldName = item.getFieldName();//获取表单名称
String fieldValue = item.getString("utf-8");//获取表单值
System.out.println(fieldName + " = " + fieldValue);
}
//item不为简单表单项,为文件表单项
else {
//获取上传文件的原始名称
String fieldName = item.getName();
//防止文件重名,在文件名前加上时间
fieldName = System.currentTimeMillis() + fieldName;
//获取输入流,其中有上传文件的内容
InputStream is = item.getInputStream();
//获取文件保存在服务器的位置
String path = this.getServletContext().getRealPath("/images");
//按照时间管理资源目录,创建时间实例
Calendar now = Calendar.getInstance();
//获取年份
int year = now.get(Calendar.YEAR);
//获取月份
int month = now.get(Calendar.MONTH) + 1;
//获取日期
int day = now.get(Calendar.DAY_OF_MONTH);
//重定义资源路径
path = path + "/" + year + "/" + month + "/" + day;
//按照指定路径创建目录
File dirFile = new File(path);
if(!dirFile.exists()) {
dirFile.mkdirs();
}
//创建目标文件,将来用于保存上传文件
File descFile = new File(path, fieldName);
//创建文件输出流
OutputStream os = new FileOutputStream(descFile);
//将输入流中的数据保存到输出流
int len = -1;
byte[] buffer = new byte[1024];
while((len = is.read()) != -1) {
os.write(buffer, 0, len);
}
//关闭流
os.close();
is.close();
//删除临时文件
item.delete();
}
}
} catch (Exception e) {
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这篇博客介绍了在Java中实现文件上传的步骤,包括前端和后台的处理。提到了所需的jar包commons-fileupload-1.4.jar和commons-io-2.6.jar,并指出了可以从Apache官网下载这些依赖。

1301

被折叠的 条评论
为什么被折叠?



