FileUpload——在Struts2中上传文件
大家可能注意一个问题很久了,在现在我们使用的Struts2版本中有一个commons-fileupload.jar,之前我们就提到,这个jar包主要是对文件上传的支持,看来Struts2认为在一个应用中文件的上传是个必要。本章节我们就一起来看看怎样在Struts2中实现文件上传,配置及基本做法。
配置
在我们现在使用的版本中我们不需要什么配置,除非你想做点特别的事情。这里我们不讨论Struts2其他版本的文件上传问题。
基本做法
OK,我们看到要实现文件上传基本上不需要额外的配置,比如说什么上传插件啦,相信我们的Struts2在这方面的使用时非常方便的。
现在我们抛去Struts2,来想一想我们平时或以前在编写应用时怎样来实现文件上传的呢。要关心文件流的读写问题,存放位置,文件的打开与关闭,请求方式等等。带着我们平时编码的这些问题来看看Struts2中的解决方式。
Step1: new一个jsp页面作为文件上传的页面
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"
prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>FileUpload Page</title>
</head>
<body>
<h2>Please
select a file </h2>
<s:form action="doUpload" enctype="multipart/form-data"
method="post">
<s:file name="upload" label="Upload
File"/>
<s:textfield name="caption" label="Caption"
/>
<s:submit></s:submit>
</s:form>
</body>
</html>
这里你或许注意到了,我使用了<X:file>标签,作用就是在客户端产生一个文件域用来上传文件,然后我们为文件添加了一个标题(catpion)。还要注意这里我们更改了form提交的数据类型(enctype=”multipart/form-data”),这个不难理解,因为我们平时就是这么做的。
Step2:new 一个 jsp页面作为上传成功后的页面,并在页面上显示上传文件的基本信息
<%@ page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"
prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Upload Successfully</title>
</head>
<body>
<h2>Here
are some message about uploaded file</h2>
<p>
<b>File:</b> <s:property value="upload" /><br />
<b>Caption:</b> <s:property value="caption" /><br />
<b>ContentType:</b> <s:property value="uploadContentType" /><br />
<b>FileName:</b> <s:property value="uploadFileName"/><br />
</p>
</body>
</html>
Step3: new 一个Action类,在Action里我们期望得到文件本身和文件的名称还有contentType。
package com.lele.struts2.fileuploadTest;
import java.io.File;
public class FileUploadAction {
private File upload;
private String caption;
private String uploadContentType;
private String uploadFileName;
public String execute() {
return "success";
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getCaption() {
return caption;
}
public void setCaption(String caption) {
this.caption = caption;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
}
这个Action就是解决问题的关键了,在这里我们的做法和之前的Action没有什么差别,就是这么简单。
Step4: 在Action的配置文件里进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache
Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="fileupload" extends="struts-default">
<action name="index">
<result>fileUpload.jsp</result>
</action>
<action name="doUpload" class="com.lele.struts2.fileuploadTest.FileUploadAction">
<result>success.jsp</result>
</action>
</package>
</struts>
这里就不贴web.xml中的配置信息了,大家自己来吧。
现在我们就一起来看一下最终结果:
下面我们上传一个文件,然后填写文件标题提交一下:
大家或许看到的信息和我差不多,File就是上传成功后最终文件的位置及文件本身。ContentType就是消息类型(MIME类型),FileName就是文件的真实名称。
大家或许注意到了一些东西,在上传文件的页面中只有<x:file>和<x:textfield>,怎么在Action里有4个?这明显不对应。这一切都是<x:file>的缘故,一个标签对应了三个属性(upload
uploadContentType uploadFileName)。
引发的问题
在上面我们看到了在Struts2中的文件上传,相信你会感觉到在Struts2中文件上传的简单。不过上传文件的过程中发生了一些比较微妙的事情,您或许注意到在eclipse的控制台下产生的日志中看到了一些信息:
信息: Unable to find
'struts.multipart.saveDir' property setting. Defaulting to
javax.servlet.context.tempdir
信息: Removing file upload
E:\MyJavaWorkplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\struts2FileUploadTest\upload__419b20ce_12c9676ac91__8000_00000002.tmp
这里我们并不能把这些信息看作为错误,第一条说的是struts.multipart.saveDir属性没有配置,struts.multipart.saveDir用于指定存放临时文件的文件夹。既然是属性没有配置,那么就配置一下好了。我们可以在
Struts.property中添加上面的信息:
struts.multipart.saveDir=路径
这样上传的文件就会临时保存到你指定的目录里了。
第二条说的是移除了一个文件,因为我们上传文件并没有关心文件究竟到什么地方,也没有进行处理,在Struts2看来这些文件就是临时文件应当被清理,合理。现在看来我们要保留住上传的文件还要自己动手来做,你可以自己写一个IO操作类,也可以用common-fileupload.jar中的util,都可以的,看你怎么玩了。当然我们也可以在Action中直接处理文件。
现在还要提一个问题,假设选择没有文件,没有填写文件标题能不能提交?问题很明显,要做一个严谨的Web程序我们是不允许这样做的,可怎么来处理呢?我们就要用到校验器了(我之前的文章可能未提及到),我们使用简单的方式:
首先要求被校验的Action类继承自ActionSupport
然后在Action类的目录下new一个Action类名-validation.xml,在其中填写以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="upload">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[upload.length() > 0]]></param>
<message>File
cannot be empty</message>
</field-validator>
</field>
<field name="caption">
<field-validator type="requiredstring">
<message>Caption
cannot be empty</message>
</field-validator>
</field>
</validators>
最后我们要修改Action配置文件,在<result>元素位置进行修改:
<result name="input">fileUpload.jsp</result>
<result>success.jsp</result>
这样就Ok了。
能不能校验文件类型,文件大小?能,不过做法有点不太一样。我们需要从“根”入手,先来看做法:
修改Action配置文件:
<action name="doUpload" class="com.lele.struts2.fileuploadTest.FileUploadAction">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/bmp,image/x-png,image/pjpeg,image/gif
</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="input">fileUpload.jsp</result>
<result>success.jsp</result>
</action>
没错我们使用了拦截器,当然这个拦截器不是我们自己写的而是Struts2本身的东东,在这里我们要求上传类型必须是图片类型,而后我们还需要之前的默认拦截器,因为我们要校验。(对拦截器不明白的朋友可以去看我之前的文章:Struts2的核心——拦截器)。
这时我们再来上传文件,就会发现我们只能上传指定的文件类型了,同样可以使用maximumSize参数来设定上传文件大小。
不过新的问题又来了,校验是没问题了,校验失败时输出的信息可有点烦人,能不能换成自定义的信息。当然这种信息是Struts2默认信息,不要以为是什么错误。这种情况下我们就要在全局国际资源文件中做点事情了。在资源文件中加入“struts.messages.error.content.type.not.allowed=The file you uploaded
required image。现在可以了吧。
OK,本章节内容就到这里了,下面的章节会介绍到多文件上传,有兴趣的朋友继续向下读。下个章节再见。
- 大小: 10.2 KB
- 大小: 6.1 KB
分享到:
相关推荐
在Struts2中,文件上传是一项常见的功能,它允许用户通过表单提交文件到服务器。这篇自学笔记将深入探讨Struts2的文件上传机制。 1. **文件上传原理** 文件上传是基于HTTP协议的POST请求实现的。在HTML表单中,...
在文件上传场景中,我们通常会使用`CommonsFileUploadInterceptor`拦截器,它是Struts2对Apache Commons FileUpload库的封装,可以处理文件上传请求。 Apache Commons FileUpload是一个用于处理HTTP多部分请求的库...
在Struts2中,文件上传主要依赖于Apache Commons FileUpload库。这个库提供了处理HTTP多部分请求的能力,使得我们能够方便地获取并处理上传的文件。在`struts.xml`配置文件中,我们需要配置一个特定的拦截器——`...
在Struts2中集成Pell,可以为用户提供一个直观的界面来选择和上传文件,而无需复杂的前端技术。 首先,我们需要理解Struts2的Action类。Action类是Struts2的核心,它是业务逻辑的载体。当用户提交表单时,Struts2会...
在Struts2中,文件上传主要依赖于Apache的Commons FileUpload库。首先,我们需要在项目的类路径下引入该库的JAR文件。接下来,我们来看看实现文件上传的关键步骤: 1. **配置Struts2**: 在`struts.xml`配置文件中...
2. **标签**:在JSP页面中,使用Struts标签库的`<html:form>`来创建表单,设置`enctype="multipart/form-data"`属性,以便支持文件上传。 3. **Commons FileUpload**:Apache Commons FileUpload库是处理multipart/...
然后,确保项目中包含了Struts框架所需的库文件,特别是用于文件上传的`commons-fileupload.jar`。 2. **创建ActionForm** 创建一个ActionForm类用于封装表单数据。如果需要上传文件,该类中的相应属性应该声明为...
在Struts2中,OGNL用于在Action和视图之间传递数据,以及在拦截器中进行表达式评估。 5. **commons-io-1.3.2.jar**:Apache Commons IO是Java标准库的一个补充,提供了一系列实用的I/O操作工具,如文件读写、流处理...
首先,我们需要了解Struts2文件上传的核心组件——`FileUploadInterceptor`拦截器。这个拦截器负责处理上传请求中的文件内容。在Struts2的配置文件(struts.xml)中,我们需要启用这个拦截器并将其添加到默认或特定...
- 在Struts2中,拦截器的使用通过配置文件`struts.xml`进行。你可以添加、删除或调整拦截器的执行顺序,只需在配置文件中指定即可。这种可插拔式设计使得开发者可以根据需求自由定制拦截器链。 4. **内置拦截器**...
在Struts2中,文件上传功能是常见的需求之一,它允许用户从客户端上传文件到服务器端进行处理或存储。本篇文章将深入探讨Struts2中的文件上传机制,以及如何通过源代码实现这一功能。 首先,我们需要理解Struts2...
### Java Struts2入门学习实例——使用Struts2快速实现多个文件上传 #### 知识点一:配置Struts2中的错误提示信息 在开发基于Java的Web应用程序时,经常需要处理用户上传文件的需求。而Struts2框架因其灵活性与...
- 在Struts2中,文件上传主要依赖于`Commons-fileupload`库,该库由Apache出品,被广泛用于文件上传任务。 - Struts2框架自身提供了处理文件上传的拦截器`FileUploadInterceptor`,简化了文件上传的过程。 - 开发者...
综上所述,"myeclipse+struts实例——3"旨在通过MyEclipse和Struts在Tomcat服务器上实现文件上传功能,这涉及到了Web开发中的前端交互、后端处理、文件存储以及异常管理等多个技术环节。通过学习这个实例,开发者...
在本文中,我们将深入探讨如何使用ExtJS4和Struts2框架实现文件上传功能。首先,让我们了解一下这两个关键技术和它们在文件上传中的作用。 **ExtJS4:** ExtJS4是一个强大的JavaScript库,用于构建富客户端应用程序...
Struts2图片上传项目是一个基于Java的Web应用框架——Struts2实现的,它允许用户在网站上上传图片。在Web开发中,图片上传功能是非常常见的,例如在社交媒体、电商平台或者个人博客等场景。Struts2作为一个强大的MVC...
4. **文件处理**:在Action类中,使用Apache Commons FileUpload库解析上传的多部分请求,将文件保存到服务器的特定目录。 二、图片服务器端存储 1. **存储路径**:确定一个安全的服务器路径来保存用户上传的图片。...
#### 三、Struts 2中的FileUpload拦截器 Struts 2框架通过FileUpload拦截器实现了文件上传的功能。该拦截器主要负责解析HTTP请求中的multipart/form-data格式的数据,并将其转换为可操作的对象。 - **FileUpload...