javaWEB上传文件讲解

在web网站中上传文件,一般使用form表单提交数据


<form id="proform" method="post" enctype="multipart/form-data" >
   <input type="text" name="pname" />
   <input type="text" name="marketPrice" />
   <input type="text" name="shopPrice"/>
   <input type="radio" name="isHot" checked="checked" value="1" />热门
   <input type="radio" name="isHot"  value="0"  />不热门  
   <inpu type="file" name="pimage" />
</form>
首先表单必须声明post方式提交,因为get方式提交的数据有限,一般上传文件都比较大
表单中也需要加入 enctype属性,该属性有三种取值:



如果想要使得表单有文件上传功能需要加enctype="multipart/form-data"  该属性。
还需要添加文件上传控件:<input type="file" name="pimage" />
type:必须为file类型,显示效果:以下操作采用火狐浏览器,每个浏览器的展示样式不一样


准备好以上前端设置,就可以上传文件了
在提交的时候就是按照POST方式提交所有表单中的数据,当然文件也是会提交,在浏览器端按F12可以查看提交的参数信息:



文件上传就是传输该文件的二进制数据,所以在后台把这些二进制数据再重新组装成一个对应的文件存下了,文件就上传成功了,
大家也看到了,这个上传的数据很多,大部分时候上传的时候不只是上传文件,还有和文件相关的一些文字信息,就需要我们在后台将这些数据进行解析分离。
首先,我们需要在后台将这些数据都获取到,我们之前有request.getParamter("xxx");可以得到对应的值,但是form 表单加上
enctype="multipart/form-data" ,后这种方式就得不到值了。
这时我们就需要借助第三方工具了,
commons-fileupload-1.2.1.jar;
commons-io-1.4.jar;

以上两个jar包就是文件上传所需要的第三方jar包,提供了非常方便的文件解析方式,

以下代码就是把前端传来的数据全部封装到一个Map集合中:

/**
	 * 对request对象进行数据封装的方法
	 */
	public static Map<String,Object> getParamterMap(HttpServletRequest request){
		DiskFileItemFactory fileupFactory = new DiskFileItemFactory();	//创建一个工厂
		ServletFileUpload fileUpload = new ServletFileUpload(fileupFactory); //创建一个解析对象,专门用来解析上传文件的表单
		Map<String,Object> fieldMap = new HashMap<String, Object>(); //创建一个Map集合,用来暂时存放前台填写的数据
		try {
			List<FileItem> fieldlist = fileUpload.parseRequest(request);  //解析请求,获得表单数据的字段集合
			for(FileItem item : fieldlist){ //遍历集合中每一字段
				if(item.isFormField()){	//如果是普通输入框
					String fieldName = item.getFieldName(); //获得该字段名称,也就是input中的name属性的值
					String value = item.getString(); //获得该字段的值,就是input中的value属性的值
					System.out.println(fieldName+":"+value);
					fieldMap.put(fieldName, new String(value.getBytes("iso-8859-1"),"utf-8"));//解决中文乱码
					
				} else { //否则就是文件上传的字段
					System.out.println("上传图片");
					String filename = item.getName(); //文件名
					String fieldName = item.getFieldName(); //字段名
					if(filename==null||"".equals(filename)){//如果没有选择文件,则filename=""
						fieldMap.put(fieldName, null);
						continue;//就不需要执行下面的文件复制的过程了
					}
					try { //在这里开始复制客户端的文件到服务器
						InputStream in = item.getInputStream(); //获得文件输入流
						//获得文件存放目录的绝对路径
						String proPath = request.getServletContext().getRealPath("products");
						//创建该目录对象,如果不存在则创建
						File DirFile = new File(proPath);
						if(!DirFile.exists()){
							DirFile.mkdirs();
						}
						String extension = realName.substring(filename.lastIndexOf("."));//截取文件后缀名
						String uuidName = new Date().getTime()+extension;//以当前时间为文件名+后缀名
						System.out.println(uuidName);
						File DiskFile = new File(DirFile,uuidName);//创建磁盘复制文件
						if(!DiskFile.exists()){
							DiskFile.createNewFile();//不存在则创建该文件
						}
						System.out.println(DiskFile.getAbsolutePath());
						FileOutputStream os = new FileOutputStream(DiskFile);//创建指向复制文件的输出流
						IOUtils.copy(in, os);//执行复制操作,该对象由以上第三方提供
						IOUtils.closeQuietly(in);//关闭输入流
						IOUtils.closeQuietly(os);//关闭输出流
						fieldMap.put(fieldName, "products+uuidName);//把该字段加进Map集合
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return fieldMap;
	}




通过以上代码可以得到一个存放了传输的数据的Map集合,而且传输的文件也已经复制到服务器,接下来就可以操作了


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值