文件上传原理

handup.jsp页面
在这里插入图片描述

servlet页面
@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决浏览接收页面传过来的中文乱码的情况
		request.setCharacterEncoding("utf-8");
		//文件通过表单上传
		Scanner scanner=new Scanner(request.getInputStream());
		while(scanner.hasNext()){
			System.out.println(scanner.nextLine());
		}
		System.out.println("hello");
	}
}

表单使用二进制提交数据的时候 (enctype=“multipart/form-data”) 在Servlet 在使用过request.getParameter() 无法获取到数据的.request.getInputStream(),获得文件的二进制流内容,使用Scanner读取出来,并输出,可以看到结果是如下:
在这里插入图片描述
2.使用Apache FileUpload组件实现文件上传
2.1导入jar包
1 ) commons-fileupload-1.2.2.jar
查看文档commons-fileupload-1.2.2\site (User guide)
2) commons-io-1.4.jar

@WebServlet("/upload")
public class FileUploadWithFileUploadCommoms extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 不能处理二进制提交中文乱码问题
		// request.setCharacterEncoding("utf-8");

		// 判断是否是post提交(表但有文件提交,提交方式必须为post),是否有contentType
		// contentType是否以multiply/开头
		// 判断是否有上传文件请求
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		if (!isMultipart) {
			// 如果没有没有上传请求,退出程序
			return;
		}
		try {
			// 创建一个FileItem工厂
			FileItemFactory factory = new DiskFileItemFactory();
			// 创建文件上传的处理器
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 解析请求,把请求中的数据封装成List<FileItem>
			List<FileItem> items = upload.parseRequest(request);
			//
			for (FileItem fileItem : items) {
				// 判断是否为普通的表单控件的数据
				// 获取表单控件中的name属性值
				System.out.println("getFieldName:" + fileItem.getFieldName());
				/**
				 * 将文件保存到项目下
				 * HTTP 协议只能访问部署出去的项目中的文件.
				 * 解决方案: 把文件存到项目中.
				 * 就是你通过网络访问肯定是不能访问到磁盘文件的文件的,所以你需要将文件保存到项目目录下
				 */
				if (fileItem.isFormField()) {
					// 获取普通表单控件的value值,直接指定编码为utf-8就可以了
					System.out.println(fileItem.getString("utf-8"));
				} else {
					// 使用UUID使文件名唯一,如果文件名一样会产生覆盖
					String fileName = UUID.randomUUID().toString() + "."
							+ FilenameUtils.getExtension(fileItem.getName());
					String BaseDir = request.getServletContext().getRealPath("/upload");
					// 获取文件名
					System.out.println("getName:" + fileItem.getName());
					
					// 直接把文件写到一个File对象中
					File file = new File(BaseDir, fileName);
					//判断文件是否为文件,非文件类型不保存
					String contentType=fileItem.getContentType();
					if(contentType.startsWith("image/")){
						fileItem.write(file);
					}
					
					//设置文件大小限制
					//1.设置总上传文件的大小
					upload.setFileSizeMax(1024*3);
					//2.设置单个文件上传大小
					upload.setFileSizeMax(1024*2);
					/*      默认的缓存大小:        10240 = 10kb
							默认的临时目录:        apache-tomcat-8.0.50\temp
							factory.setSizeThreshold(yourMaxMemorySize);
							factory.setRepository(yourTempDirectory);
							建议使用默认的.
					 */
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值