java表单——文件的上传

这篇博客介绍了在Java中实现文件上传的步骤,包括前端和后台的处理。提到了所需的jar包commons-fileupload-1.4.jar和commons-io-2.6.jar,并指出了可以从Apache官网下载这些依赖。

需要用到的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);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值