一、界面配置
<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>上 传</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;
}