Struts2实现文件上传

来源:互联网 发布:药品销售软件 编辑:程序博客网 时间:2024/04/29 06:06

在讲文件上传之前,我们先来看表单的enctype属性。

application/x-www-form-urlencoded:默认值,表单数据被编码为"名称/值",这是标准的编码方式。

multipart/form-data:上传二进制数据,只有使用multilpart/form-data,才能完整的传递数据,进行文件上传。

text/plain:表单数据以纯文本的形式进行编码,其中不含任何控件或格式字符。

Struts2使用的上传框架:Common-FileUpload => apache的开源项目,由jakarta项目组开发。

使用jar包:

1:commons-fileupload-XXX.jar(http://jakarta.apache.org/commons/fileupload/)

2:commons-io-XXX.jar(http://jakarta.apache.org/commons/io/)


项目演示:

upload.jsp:

<body>    <form action="uploadAction_test.action" method="post" enctype="multipart/form-data">    请选择文件:<input type="file" name="uploadFile"/>    <input type="submit" value="提交">    </form>  </body>
注:在上传页面的form表单中必须加上属性:enctype="multipart/form-data"
UploadAction.java:

public class UploadAction {/* 定义上传文件 */private File uploadFile;/* 定义上传文件的类型 【文件+ContentType不能省略和拼写错误】*/private String uploadFileContentType;/* 定义上传文件的原始名称 【文件+FileName不能省略和拼写错误】*/private String uploadFileFileName;public File getUploadFile() {return uploadFile;}public void setUploadFile(File uploadFile) {this.uploadFile = uploadFile;}public String getUploadFileContentType() {return uploadFileContentType;}public void setUploadFileContentType(String uploadFileContentType) {this.uploadFileContentType = uploadFileContentType;}public String getUploadFileFileName() {return uploadFileFileName;}public void setUploadFileFileName(String uploadFileFileName) {this.uploadFileFileName = uploadFileFileName;}/* 测试方法 */public String test() throws IOException {/* 假设保存的虚拟路径为/upload,通过虚拟路径去获取绝对路径 */String realPath = ServletActionContext.getRequest().getRealPath("/upload");/* 构造文件路径 */File file = new File(realPath);/* 如果不存在 */if (!file.exists()) {file.mkdirs();}/* 使用struts2的工具类进行上传,第二个参数是目标文件(我们通过文件加上文件名的方式进行构建) */FileUtils.copyFile(uploadFile, new File(file, uploadFileFileName));return "ok";}}


多文件上传:

upload.jsp:

 <body>    <form action="uploadAction_test.action" method="post" enctype="multipart/form-data">    请选择文件:<input type="file" name="uploadFiles"/></br>    <input type="file" name="uploadFiles"/></br>    <input type="submit" value="提交">    </form>  </body>

UploadAction.java:

public class UploadAction {/* 定义上传文件 */private File[] uploadFiles;/* 定义上传文件的类型 【文件+ContentType不能省略和拼写错误】 */private String[] uploadFilesContentType;/* 定义上传文件的原始名称 【文件+FileName不能省略和拼写错误】 */private String[] uploadFilesFileName;public File[] getUploadFiles() {return uploadFiles;}public void setUploadFiles(File[] uploadFiles) {this.uploadFiles = uploadFiles;}public String[] getUploadFilesContentType() {return uploadFilesContentType;}public void setUploadFilesContentType(String[] uploadFilesContentType) {this.uploadFilesContentType = uploadFilesContentType;}public String[] getUploadFilesFileName() {return uploadFilesFileName;}public void setUploadFilesFileName(String[] uploadFilesFileName) {this.uploadFilesFileName = uploadFilesFileName;}/* 测试方法 */public String test() throws IOException {/* 假设保存的虚拟路径为/upload,通过虚拟路径去获取绝对路径 */String realPath = ServletActionContext.getRequest().getRealPath("/upload");/* 构造文件路径 */File file = new File(realPath);/* 如果不存在 */if (!file.exists()) {file.mkdirs();}/* 遍历所有上传的文件 */for (int i = 0; i < uploadFiles.length; i++) {/* 获取文件 */File uploadFile = uploadFiles[i];/* 上传 */FileUtils.copyFile(uploadFile, new File(file, uploadFilesFileName[i]));}return "ok";}}


附加:上传文件的类型拦截
在struts.xml文件中拦截上传文件的类型:

<action name="uploadAction_*" class="com.lixue.web.action.UploadAction" method="{1}"><interceptor-ref name="defaultStack"><param name="fileUpload.allowedTypes"><!-- fileUpload.allowedTypes为固定写法 -->image/png,image/jpeg</param></interceptor-ref><result name="ok">/uploadOK.jsp</result><result name="input">/fileInput.jsp</result><!-- 当文件类型不支持时,系统默认转发到input视图 --></action>

在struts.xml文件中加入如下常量:

<!-- 国际化文件(message是我们自定义的属性文件的文件名) --><constant name="struts.custom.i18n.resources" value="message" />

fileInput.jsp视图(这个标签的内容是通过系统注入的):

<body>    <s:fielderror></s:fielderror>  </body>

注:如果这仅仅这样配置的话,提示的是英文,所以要使用国际化:

1.在src目录下添加一个message.properties文件。

2.用视图add的方式添加属性: struts.messages.error.content.type.not.allowed(如图)




0 0
原创粉丝点击