javaWEB上传文件讲解

来源:互联网 发布:乖离账号数据丢失 编辑:程序博客网 时间:2024/06/05 23:42

在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集合,而且传输的文件也已经复制到服务器,接下来就可以操作了


原创粉丝点击