文件上传

1)上传控件所在的form表单的method,必须为POST

      因为GET方式传入的数据大小不能超过2KB,而POST没有大小限制

2)上传控件必须使用type="file"

3)表单的编码方式必须是二进制编码,<form enctype="multipart/form-data">

  <form action="upload" method="post" enctype="multipart/form-data">
      	账号:<input type="text" name="userName"/><br/>
      	邮箱:<input type="text" name="email"/><br/>
      	头像:<input type="file" name="headImg" accept="image/*"><br/>
      	<input type="submit" value="注册"> 
      </form>

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//解析和检查请求:请求方式是否是POST,请求编码是否是multipart/form-data
		boolean isMultipart =ServletFileUpload.isMultipartContent(req);
		if(!isMultipart) {
			return; //结束,不运行后面的
		}
		try {
			//1.创建FileItemFactory对象
			//FileItemFactory是用来创建FileItem对象的
			//FileItem对象:form表单中的表单控件的封装
			FileItemFactory factory=new DiskFileItemFactory();
			//2.创建文件上传处理器
			ServletFileUpload upload=new ServletFileUpload(factory);
			//解决上传表单乱码问题
			upload.setHeaderEncoding("utf-8");
			//3.解析请求
			List<FileItem> items=upload.parseRequest(req);
			//4.迭代出每一个FileItem
			for(FileItem item:items) {
				String fieldName=item.getFieldName();//获取表单控件的name属性值(参数名)
				if(item.isFormField()) {
					//普通的表单控件
					String value=item.getString("utf-8");
					System.out.println(fieldName+"-"+value);
				}else {
					//表单上传控件
					System.out.println(fieldName+"-"+item.getName());
					item.write(new File(item.getName()));//把二进制数据写到哪一个文件中"
				}
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}

注意点:

1)文件名处理

 IE6问题:通过FileItem.getName方法获取上传文件的名称,此时会带有路径

  fileName = fileName.substring(fileName.lastIndexOf("\\")+1);

也可以使用FilenameUtils.getName(item.getName());

上传文件名称:给上传文件起唯一的名称:UUID

2)上传文件的保存路径:一般的,把上传文件保存到应用里面

String fileName=UUID.randomUUID().toString()+"."+FilenameUtils.getExtension(item.getName());
String dir=super.getServletContext().getRealPath("/upload");
item.write(new File(dir,fileName));//把二进制数据写到哪一个文件中

它最后存在这里


缓存大小和临时目录

超过多少就不直接存放内存了(缓存大小):默认值是10KB

不放在内存,会放在哪个位置(临时目录):默认是Tomcat根/temp目录,不建议修改

factory.setSizeThreshold(20*2014); //20kb
//设置缓存大小
factory.setRepository(repository);
//设置临时目录



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值