java struts注意事项_Struts2文件上传,以及各种注意事项

首先肯定是要配置好struts2环境,这个在另一篇《struts2环境搭建,以及一个简单实例》里已经讲过了

首先是网页部分,upload_file.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Upload File

查看代码

上传文件的表单,metho必须设置成post,enctype必须设置成multipart/form-data。

从上面代码中可以看到这个表单提交给了UploadFile这个action来处理,那我们在struts.xml里面配置如下:

/uploadResult.jsp

20971520

fileUpload拦截器,用于设置上传路径,限制文件类型和大小。

关于限制文件大小,光有是不行的,还必须在标签下添加

这行代码表示整个项目所有要上传文件的地方允许上传的文件大小的最大值,也就是说这个项目里上传的任何单个文件大小不能超过21000000字节(约20M),如果项目中不添加这行代码,则默认允许上传的文件大小最大为2M,所以这也是突破struts2只能上传2M文件的限制的方法。

关于限制文件类型,如果需要限制为图片文件,则可以这样配置

image/bmp, image/x-png, image/gif, image/jpeg

标签中的值都是文件的MIME类型,常用文件的MIME类型可以在%TOMCAT_HOME%\conf\web.xml中找到。

如果要限制为word文件,则可以可以这样配置

application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document

然而我感觉这样来限制文件类型,不如用javascript在前端实现限制。

接下来写UploadAction,UploadAction必需的私有属性是source,这是和upload_file.jsp里面文件域的name属性是一致,就是说文件域的name属性值为source,则UploadAction中必需有私有属性source,另外,还有两个比较重要的私有属性:

private String sourceFileName; //待上传文件的文件名

private String sourceContentType; //待上传文件的文件类型

这两个变量名的格式就是前面的前缀source和upload_file.jsp中的文件域的name属性相同。

综合来说,就是,比如upload_file.jsp中文件域的name = “abc”,则Action中就需要这样定义

privateFile abc;privateString abcFileName;private String abcContentType;

abc会自动获取要上传的文件对象,abcFileName自动获取文件名,abcContentType自动获取文件类型。

关于上传路径,是我要重点说一下的。

如果是上传到绝对路径,那还挺好搞的,但如果要上传到项目根目录下的upload文件夹呢,怎么获得这个upload文件夹的完整路径?

我尝试过使用

ServletActionContext.getServletContext().getRealPath("/upload");

但返回了null。也用过

ServletActionContext.getRequest().getRealPath("/upload");

还是返回了null。但在网上查下这个问题,很多人都推荐这么写,证明可能某些情况下这样写确实是可行的,但也有跟我一样返回null的人,他们同时推荐了一种新的方法,就是让UploadAction实现ServletContextAware接口。具体做法如下:

public class UploadAction extends ActionSupport implementsServletContextAware {/*** 省略其它代码...*/

private ServletContext context;

publicServletContext getContext() {returncontext;

}public voidsetContext(ServletContext context) {this.context =context;

}@Overridepublic voidsetServletContext(ServletContext context) {this.context =context;

}}

然后使用

String path= context.getRealPath("/upload");//重要:斜杠不能少

获得upload文件夹的路径。然后执行上传:

/*将文件上传到upload文件夹下*/File savefile= newFile(path, sourceFileName);

FileUtils.copyFile(source, savefile);

我个人是比较推荐这种方法的,因为这种方法好像规避了当项目被打包转移到其它环境时也能保证获得正确的路径。

后面贴上UploadAction的完整代码UploadAction.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.lidi.action;importjava.io.File;importjava.io.IOException;importjavax.servlet.ServletContext;importorg.apache.commons.io.FileUtils;importorg.apache.struts2.util.ServletContextAware;importcom.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport implementsServletContextAware {/****/

private static final long serialVersionUID = 1L;private File source;//待上传文件

private String sourceFileName;//待上传文件的文件名

private String sourceContentType; //待上传文件的文件类型

private ServletContext context; //重要

/*重要*/

publicServletContext getContext() {returncontext;

}public voidsetContext(ServletContext context) {this.context =context;

}/*getters & setters*/

publicFile getSource() {returnsource;

}public voidsetSource(File source) {this.source =source;

}publicString getSourceFileName() {returnsourceFileName;

}public voidsetSourceFileName(String sourceFileName) {this.sourceFileName =sourceFileName;

}publicString getSourceContentType() {returnsourceContentType;

}public voidsetSourceContentType(String sourceContentType) {this.sourceContentType =sourceContentType;

}

@Overridepublic voidsetServletContext(ServletContext context) {this.context =context;

}public String execute() throwsIOException {/*获取存放上传文件的路径:项目根目录upload文件夹*/String path;

path= context.getRealPath("/upload");//重要:斜杠不能少

System.out.println(path);/*将文件上传到upload文件夹下*/File savefile= newFile(path, sourceFileName);

FileUtils.copyFile(source, savefile);

System.out.println(savefile.getAbsolutePath());returnSUCCESS;

}

}

查看代码

上传结果页uploadResult.jsp

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Upload Result

文件名:

文件类型:

文件:">

查看代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值