利用struts1 formfile实现文件上传功能

一、界面配置


 
 
 
 


 
账户管理> 账号管理 > 资料设置

 
 
    
      <%
        String curHead =CONTEXT+"/images/common/csw_toux.gif";
           if(bean != null && !StringUtil.isEmpty(bean.getHeadImage())){
            curHead = bean.getHeadImage();
            if(curHead.indexOf("usercenter/headImg") != -1){
             curHead = CONTEXT +"/" + curHead;
            }else{
             curHead = arequest.getImage(curHead);
            }
           }
      %>
     
     
  

 



是Struts表单,要想用此表单上传文件必须要设置 enctype 和 method 参数才行,enctype 参数用于设置该表单的编码方式,当该表单中包含了 是必须要将enctype的属性值设置为:"multiparty/form-data" ,并且要将表单的提交方式Method属性设置为"Post";在action处填入处理表单的Action访问路径。

      是Struts提供的文件上传组件,其属性property要与承载数据的ActionForm类的FormFile类型的属性保持一一对应的关系。ActionForm类中的属性书写见步骤二。


二、form配置

  在项目中新建一个ActionForm的子类,如命名为:FileUploadForm.java,在其中新增一个FormFile类型的属性uploadFile,并设置getter、setter方法。

在Struts中,一个FormFile类型的对象对应Form表单中创送的一个文件,Struts将上传的文件信息封装金FormFile中,通过FormFile提供的方法可以方便的进行文件的操作。其实FormFile是一个接口,位于 org.apache.struts.upload.FormFile 中,它定义了操作上传文件的基本方法。

      FormFile接口定义的常用方法:

      (1) getFileName()/setFileName()   //用于获取或设置文件名;

      (2) getFileSize() / setFileSize()      //用于获取或设置文件字节数;

      (3) getFileData()                           //用于获取文件的字节数组,用于小的文件;

      (4) getInputStream()                    //用于获取文件的输入流,用于较大的文件;

      (5) destory()                                 //销毁FromFile;


private FormFile headImageData;
 
 public FormFile getHeadImageData() {
  return headImageData;
 }

 public void setHeadImageData(FormFile headImageData) {
  this.headImageData = headImageData;
 }


三、aciton

 在代码中可以看到,我们从FileUploadForm中找到了FormFile类型的属性,通过其提供的方法得到文件的信息,并将其存入服务器的磁盘中。在保存的过程中需要用到文件流的一些基本操作。

// 获得上传文件
   FormFile headImage = uform.getHeadImageData();

   // 调用service进行更新
   IWebUserService service = new WebUserService();
   bean = service.updateUserImage(request, headImage, user.getId(),
     contextPath, shopResource);


/**
  * 会员中心,上传头像
  */
 public User updateUserImage(HttpServletRequest request, FormFile headImage,
   String userId, String contextPath, ResourceBundle shopResource)
   throws ServiceException {

  // 用户ID是否为空
  if (StringUtil.isEmpty(userId)) {
   throw new ServiceException("no_user");
  }

  // 判断用户是否为空
  User bean = this.getUserById(userId);
  if (bean == null) {
   throw new ServiceException("no_user");
  }

  // 判断上传文件是否存在
  if (headImage == null) {
   throw new ServiceException("no_file");
  }

  // 判断图片是否太大
  int fileSize = headImage.getFileSize() / 1024;
  if (fileSize > 300) {
   throw new ServiceException("file_large");
  }

  // 生成新的文件
  String fileName = "";
  try {
   fileName = ImageHelper.updateAdElement(request, headImage, "",
     "headimg", shopResource, ProductHelper.PRODUCTFILE_ROOT);

  } catch (Exception ex) {
   throw new ServiceException("fileName_gen_error");
  }

  // 图片上传路径
  String imageRootPath = shopResource
    .getString(ProductHelper.PRODUCTFILE_ROOT);
  String piccurl = contextPath;

  UserBO bo = new UserBO();

  // 删除老的图片
  if (headImage != null && headImage.getFileSize() > 0) {

   if (!StringUtil.isEmpty(bean.getHeadImage())
     && bean.getHeadImage().indexOf(imageRootPath) != -1
     && !StringUtil.isEmpty(fileName)) {
    String picurl = bean.getHeadImage();
    if (bean.getHeadImage().indexOf("http") != -1) {
     picurl = bean.getHeadImage().substring(piccurl.length(),
       bean.getHeadImage().length());
     FileUtil.deleteFile(request.getRealPath(picurl));
    } else {
     FileUtil.deleteFile(request.getRealPath(picurl));
    }

   }
   // if (fileName.indexOf("http") == -1) {
   // bean.setHeadImage(piccurl + "/" + fileName);
   // } else {
   bean.setHeadImage(fileName);
   // }

   try {
    bo.updateBean(bean);
   } catch (Exception ex) {
    throw new ServiceException("update_error");
   }

  } else {

   String systemHeadImage = request.getParameter("systemHeadImage");

   // 判断是否符合格式
   if (!StringUtil.isEmpty(systemHeadImage)) {
    boolean isbig = FileUtil.checkFileExtName(systemHeadImage);
    if (!isbig) {
     throw new ServiceException("prefix_no_fit");
    }
   }

   if (!StringUtil.isEmpty(bean.getHeadImage())
     && bean.getHeadImage().indexOf(imageRootPath) != -1
     && !systemHeadImage.equals(bean.getHeadImage())) {
    String picurl = bean.getHeadImage();
    // if (StringUtil.isEmpty(fileName)
    // && bean.getHeadImage().indexOf("http") == 0) {
    if (StringUtil.isEmpty(fileName)) {
     if (bean.getHeadImage().indexOf("http") != -1) {
      picurl = bean.getHeadImage().substring(
        piccurl.length(), bean.getHeadImage().length());
      FileUtil.deleteFile(request.getRealPath(picurl));
     } else {
      FileUtil.deleteFile(request.getRealPath(picurl));
     }

    }

   }
   if (!systemHeadImage.equals(bean.getHeadImage())) {
    bean.setHeadImage(systemHeadImage.substring(
      systemHeadImage.indexOf("usercenter/headImg"),
      systemHeadImage.length()));
    try {
     bo.updateBean(bean);
    } catch (Exception ex) {
     throw new ServiceException("update_error");
    }
   }
  }

  return bean;
 }

文件保存

public static String updateImageFileByRelPath(String rootPath,
   String oldFile, FormFile formFile) {
  // 上传中图片
  if (formFile != null && formFile.getFileSize() > 0) {

   // String root = request.getRealPath("/upload/");
   String fileName = DateUtil.getSysDateLong() + "."
     + FileUtil.getFileExtName(formFile.getFileName());

   File rootFolder = new File(rootPath);
   if (!rootFolder.exists()) {
    rootFolder.mkdir();
   }

   FileOutputStream fos = null;
   try {
    // if(!rootPath.startsWith("/")) {
    // rootPath = "/" + rootPath;
    // }

    if (!rootPath.endsWith("/")) {
     rootPath = rootPath + "/";
    }

    fos = new FileOutputStream(rootPath + fileName);
    fos.write(formFile.getFileData());
    fos.flush();

    if (oldFile != null && oldFile.length() > 0) {
     File file = new File(oldFile);
     if (file.exists()) {
      file.delete();
     }
    }
   } catch (Exception ex) {
    ex.printStackTrace();
   } finally {
    if (fos != null) {
     try {
      fos.close();
     } catch (Exception ex) {
      ex.printStackTrace();
     }
    }
   }
   return fileName;

  }

  return null;
 }





你可能感兴趣的:(java,架构,前端)