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

时间:2022-08-31 15:03:33

一、界面配置

<html:form  method="post" action="/account/user" enctype="multipart/form-data">
 <input type="hidden" name="actionType" value="update"/>
 <input type="hidden" name="forward" value="imageconfig"/>
 <input type="hidden" name="systemHeadImage" value="<%=CONTEXT%>/images/common/csw_toux.gif"/>
  <div class="store-right">
 <div class="store-path">账户管理> 账号管理 > 资料设置</div>
 <!-- <div class="mem-tabts">您可以在下方选择自己喜欢的头像,更新后的头像将稍后显示在其它页面!</div> -->
 
    
      <%
        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);
            }
           }
      %>
     
    <div class="p_top user_info_div of_box">
     <div>
      <a href="<%=CONTEXT %>/account/user.do?actionType=regedit&userSubChoose=userInfoEdit&userChoose=yunboceaccount&parentId=Y4000000" class="status_tab">基本资料</a>
      <a href="<%=CONTEXT %>/account/user.do?actionType=uploadimage&userSubChoose=changeImage&userChoose=yunboceaccount&parentId=Y4000000" class="status_tab cur_status_tab">头像照片</a>
     </div>
     <div class="borderb of_box head_img_box">
      <div class="cswX_Picture_zx">
       <p>头像预览</p>
       <img id="currentHeadImage" src="<%=curHead%>" width="100" height="100" align="absmiddle"/>
       <a href="javascript:submitImageForm2()" class="red_btn" style="vertical-align:middle;"><span>保存头像</span></a>
      </div>
     <div class="cswX_Picture_LBB">
      <%-- <div class="cswX_Picture_LB" id="pic0"  style="display:none">
        <%
          for(int i=0;i<10;i++){
        %>
        <div class="cswX_txzs">
         <div><a href="javascript:changeHeadImage('aniaml<%=i%>','<%=i+1%>')"><img id="aniaml<%=i%>"  src="<%if(i<9){%><%=CONTEXT%>/usercenter/headImg/aniaml_1/00<%=i+1%>.jpg<%}else{%><%=CONTEXT%>/usercenter/headImg/aniaml_1/0<%=i+1%>.jpg<%}%>"  border="0" align="absmiddle"/></a></div>
        </div>
        <%}%>
      </div> --%>
      <div class="cswX_Picture_LB of_box" id="pic1"  style="display:block">
      <p class="ta_center">推荐头像</p>
        <%
          for(int i=0;i<10;i++){
        %>
        <div class="cswX_txzs">
         <div><a href="javascript:changeHeadImage('female<%=i%>','<%=i+1%>')"><img id="female<%=i%>"  src="<%if(i<9){%><%=CONTEXT%>/usercenter/headImg/female_1/00<%=i+1%>.jpg<%}else{%><%=CONTEXT%>/usercenter/headImg/female_1/0<%=i+1%>.jpg<%}%>"  border="0" align="absmiddle"/></a></div>
        </div>
        <%}%>
      </div>
      <%-- <div class="cswX_Picture_LB" id="pic2" style="display:none">
        <%
          for(int i=0;i<10;i++){
        %>
        <div class="cswX_txzs">
         <div><a href="javascript:changeHeadImage('male<%=i%>','<%=i+1%>')"><img id="male<%=i%>"  src="<%if(i<9){%><%=CONTEXT%>/usercenter/headImg/male_1/00<%=i+1%>.jpg<%}else{%><%=CONTEXT%>/usercenter/headImg/male_1/0<%=i+1%>.jpg<%}%>"  border="0" align="absmiddle"/></a></div>
        </div>
        <%}%>
      </div>
      <div class="cswX_Picture_LB" id="pic3" style="display:none">
        <%
          for(int i=0;i<10;i++){
        %>
        <div class="cswX_txzs">
         <div><a href="javascript:changeHeadImage('personality<%=i%>','<%=i+1%>')"><img id="personality<%=i%>" src="<%if(i<9){%><%=CONTEXT%>/usercenter/headImg/personality_1/00<%=i+1%>.jpg<%}else{%><%=CONTEXT%>/usercenter/headImg/personality_1/0<%=i+1%>.jpg<%}%>"  border="0" align="absmiddle"/></a></div>
        </div>
        <%}%>
      </div> --%>

      <!-- <div class="csw-li" style="margin-top:15px;">·选择过请点击:</div>
      <div class="csw-li">
       ·您也可以在下方上传自己喜欢的头像:<span>(更新后的头像将稍后显示在其它页面)</span>
      </div> -->
      <div class="sc">
       <!-- <div id="white_layer"></div> -->
       <html:file property="headImageData" style="width:300px;border:none;"/>
       <a href="javascript:submitImageForm()" class="red_btn ml_btn" style="vertical-align:middle;"><span>上&nbsp;传</span></a>
      </div>
      <p>·建议上传100×100大小的图片,只支持jpg,jpeg,gif,bmp格式的图片,图片大小不能超过300K</p>
      
     </div>
    </div>
    
  </div> 
  </div>
 </html:form>



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

      <html:file>是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;
 }

  

相关文章