struts2.0 上传流程
一,
1, jsp 页面 form method="post" enctype="multipart/form-data" <s:file name="file"></s:file>
2,strut-xx.xml 正常配置
3,web.xml 中加入
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
4,xx.action 中 private File file ;
private String fileContentType;
private String fileFileName;
public String createWxyfb() throws Exception {
wxyfb.setId(this.wxypzService.getCounter());
UserInfo uf = (UserInfo) this.getHttpSession().getAttribute("userInfo");
wxyfb.setCjr(uf.getYhbh());
wxyfb.setCjsj(new Date());
wxyfb.setXgr(uf.getYhbh());
wxyfb.setXgsj(new Date());
if(yatp != null && yatp.isFile()){//判断是否上传文件
LogUtils.info(">>>>>>>>>>>>>>开始上传........");
String newFileName = null;
// 得到当前时间自1970年1月1日0时0分0秒开始走过的毫秒数
long now = System.currentTimeMillis();
zswjPath=ServletActionContext.getServletContext().getRealPath("/")+Constant.JZYA_FILE_PATH;
File dir = new File(zswjPath);
// 如果该目录不存在,就创建
if (!dir.exists()) {
dir.mkdirs();
}
// 为避免重名文件覆盖,判断上传文件是否有扩展名,以时间戳作为新的文件名
int index = yatpFileName.lastIndexOf(".");
if (index != -1) {
newFileName = "realFileName" + now + yatpFileName.substring(index);
this.setRealName(newFileName);
}else{
newFileName = Long.toString(now);
}
wxyfb.setTplj(zswjPath+"\\"+newFileName); //当前图片的路径
// 读取保存在临时目录下的上传文件,写入到新的文件中
InputStream is = new FileInputStream(yatp);
OutputStream os = new FileOutputStream(new File(dir, newFileName));
try{
byte[] buf = new byte[1024*1024*2];
int len = -1;
while ((len = is.read(buf)) != -1) {
os.write(buf, 0, len);
}
LogUtils.info(">>>>>>>>>>>>>>上传结束........");
}catch (Exception e) {
super.handleMessage(ActionMessages.ADD_FAILED);
}finally{
is.close();
os.close();
}
}
this.wxypzService.saveWxyfb(wxyfb);
super.handleMessage(ActionMessages.ADD_OK);
return "success";
}
二,常见错误
1, 如果上传页面时model窗体的话 则上传完之后 不能将窗口立即关闭
struts2.0 下载
struts.xml
<!-- 下载文件 -->
<action name="downloadWxyfb" class="Action" [method="downloadWxyfb"]>//说明[]内可填、可不填,填写的话应在类中添加相应的方法。
<result name="success" type="stream">
<!-- 指定下载文件的类型 -->
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<!-- 指定文件下载时缓冲区的大小 -->
<param name="bufferSize">4096</param>
<!-- 指定文件下载时缓冲区的大小 attachment:以弹出框的形式打开,inline:直接在浏览器中打开(默认)-->
<param name="contentDisposition">attachment;filename=${realName}</param>
<!-- 指定被下载文件的入口输入流 -->
<param name="inputName">inputStream</param>
</result>
struts.action
private String realName;
private InputStream inputStream; //流的入口
public InputStream getInputStream() { try{ String path= this.getHttpServletRequest().getParameter("path"); int begin=path.lastIndexOf("\\"); String wjm=path.substring(begin+1); //这一行的功能是实现下载的是否如果文件名是中文的情况下的乱码问题。 //另外一点如果是页面 xx.do?fileName=张.jpg这种情况的话,确保到后台得到//得到代码不是乱码应该设置tomcat的connector(级8080那里)添加 //useBodyEncodingForURI="true" URIEncoding="UTF-8" this.realName = new String(wjm.getBytes(),"iso-8859-1"); //第一种能用绝对路径,getResourceAsStream()只能是相对路径,具体用法可以查看相关信息 inputStream = ServletActionContext.getServletContext().getResourceAsStream(Constant.JZYA_DOWN_PATH+this.realName); //第二种 绝对路径 inputStream = new FileInputStream(new File(Constant.JZYA_DOWN_PATH+this.realName)); }catch(Exception e){ e.printStackTrace(); } return inputStream; }
Struts2使用开源项目Apache Jakarta Commons FileUpload和内建的FileUploadInterceptor拦截器实现文件上传,所需的jar包如下:
commons-logging-1.1.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.6.jar
xwork-2.0.1.jar
commons-io-1.3.1.jar
commons-fileupload-1.2.jar