Java Web基础之文件上传

来源:互联网 发布:安全优化版和官方原版 编辑:程序博客网 时间:2024/05/01 18:06

     有时候我们要将客户端的一些数据存到服务器端,而不是直接存储到数据库中,而是要将数据存储到服务器所在的磁盘上,这就要使用文件上传。他能帮我们减少了数据库服务器的压力,对数据的操作更加灵活。

  所谓的文件上传就是服务器端通过request对象获取输入流,将浏览器端上传的数据读取出来,保存到服务器端。

  在使用文件上传的时候,我们应该注意两个事项,浏览器端和服务器端的一些注意事项。

  浏览器端的事项

     首先一个form表单,他的method请求方式必须是post请求,而且必须设置属性encType=”multipart/form-data”。当然,表单里面肯定要有个文件上传控件也就是

<input type="file" name="xxx">注意name属性一定要有且必须要有值,这就是上传前浏览器端的注意事项。

 服务器端的事项

      request.getParameters()获取不到上传控件的参数,这里我们要使用

Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload),下载地址点击打开链接,导入jar包后,创建DiskFileItemFactory,创建ServletFileUpload,通过ServletFileUpload的parseRequest方法得到所有的FileItem

具体步骤如下

                 

//创建磁盘文件项工厂DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//创建一个核心文件上传对象ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);try {//解析请求,获取所有上传组件List<FileItem> list= fileUpload.parseRequest(request);//获取每一个文件项for (FileItem fileItem : list) {//判断是否为普通组件if(fileItem.isFormField()){//是//获取组件的的name值String fieldName = fileItem.getFieldName();//获取value 其中getString为获取普通组件的值并以utf-8编码接收String value = fileItem.getString("utf-8");}else{//不是//获取文件名String filename = fileItem.getName();//获取真实名称String realName = UploadUtils.getRealName(filename);//获取随机的文件名String uuidName = UploadUtils.getUUIDName(realName);//获取文件流InputStream in = fileItem.getInputStream();//获取服务器存储路径String realPath = this.getServletContext().getRealPath("/products/1");//创建输出流FileOutputStream fos = new FileOutputStream(new File(realPath, uuidName));//拷贝IOUtils.copy(in, fos);fos.close();in.close();fileItem.delete();}}






  为了防止文件名重复,我们创建了一个工具类UploadUtils,这个工具类可以直接拿来使用

public class UploadUtils {/** * 获取随机名称 * @param realName 真实名称 * @return uuid */public static String getUUIDName(String realName){//realname  可能是  1.jpg   也可能是  1//获取后缀名int index = realName.lastIndexOf(".");if(index==-1){return UUID.randomUUID().toString().replace("-", "").toUpperCase();}else{return UUID.randomUUID().toString().replace("-", "").toUpperCase()+realName.substring(index);}}/** * 获取文件真实名称 * @param name * @return */public static String getRealName(String name){// c:/upload/1.jpg    1.jpg//获取最后一个"/"int index = name.lastIndexOf("\\");return name.substring(index+1);}/** * 获取文件目录 * @param name 文件名称 * @return 目录 */public static String getDir(String name){int i = name.hashCode();String hex = Integer.toHexString(i);int j=hex.length();for(int k=0;k<8-j;k++){hex="0"+hex;}return "/"+hex.charAt(0)+"/"+hex.charAt(1);}}

原创粉丝点击