在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属性,该属性有三种取值:
还需要添加文件上传控件:<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集合,而且传输的文件也已经复制到服务器,接下来就可以操作了