1、struts2上传
以下是一个上传涉及的代码,从view到action的各个阶段代码:
页面:
Html代码
<form action="../upload/upload.action" id="exForm" method="post" enctype="multipart/form-data" >
<ul>
<li>
<input type="file" name="uploadFile" size="20"/>
<input type="submit" value="导入"/>
</li>
</ul>
</form>
action代码:
Java代码
public class UploadFileAction extends ActionSupport {
private static final long serialVersionUID = 5563083429360573304L;
/** 上传文件 */
private File uploadFile;
private String uploadFileFileName;
private String uploadFileContentType;
public String upload() {
try {
//这里是上传文件,可做具体处理
IOUtils.copy(new FileInputStream(uploadFile), new FileOutputStream(new File("C:\\" + uploadFileFileName)));
System.out.println(uploadFileFileName);
System.out.println(uploadFileContentType);
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS;
}
}
配置文件就不再描述。以上就是在struts2中上传涉及的代码,同时还可以支持同时上传多个文件:
支持同时上传多个文件:
Html代码
<form action="../upload/upload.action" id="exForm" method="post" enctype="multipart/form-data" >
<ul>
<li>
<input type="file" name="uploadFiles" size="20"/>
<input type="file" name="uploadFiles" size="20"/>
<input type="file" name="uploadFiles" size="20"/>
<input type="submit" value="导入"/>
<input type="input" name="message"/>
</li>
</ul>
</form>
和action代码:
Java代码
public class UploadFileAction extends ActionSupport {
private static final long serialVersionUID = 5563083429360573304L;
/** 上传文件 */
private File[] uploadFiles;
private String[] uploadFilesFileName;
private String[] uploadFilesContentType;
public String upload() {
try {
int index = 0;
for (File file : uploadFiles) {
IOUtils.copy(new FileInputStream(file), new FileOutputStream(new File("C:\\"
+ uploadFilesFileName[index])));
System.out.println(uploadFilesFileName[index]);
System.out.println(uploadFilesContentType[index]);
index++;
}
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS;
}}
2、几点说明
1、在上面上传过程中,页面file域属性名与action中File保持一致。如上:
Java代码
name="uploadFile"
和
private File uploadFile
多个文件需要是数组。
2、之所以如此简单,得益于struts2中默认package:struts-default中
Java代码
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
在FileUploadInterceptor中讲HttpServletRequest请求对象封装成MultiPartRequestWrapper,对上传文件提供了对上传文件的各种处理:
这里提供了对文件、文件名、contentType等属性获取的封装,当然也有对普通表单字段的封装,即如果在上传的表单中有非file域也统一可以获取,而这在普通的servlet上传中并不能简单的处理,如上面的多个文件上传表单中的message,只需要在action中有相应的getter/setter即可获取这些属性。而完成这一切的是一个叫MultiPartRequest的家伙。
3、MultiPartRequest
这是上传拦截器中处理封装的具体类,这涉及struts2中上传的底层具体实现,在这个接口中,我们能看到struts2中提供了一个默认的实现:
Java代码
public class JakartaMultiPartRequest implements MultiPartRequest
在struts2的default.properties中解析有如下说明:
Java代码
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152
这里对MIME-type为multipart/form-data的几种支持,而默认为jakarta,即在使用struts2的上传,需要添加相应的依赖(版本自行控制):
Java代码
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
4、关于file、filename、contentType
前面已经说了,在action中的File需要和也没file域中的名字保持一致,如果多个则是File数组。而如果要获取fileName以及相应的contentType,命名也有一定的限制,如上面的action中:
Java代码
private File[] uploadFiles;
private String[] uploadFilesFileName;
private String[] uploadFilesContentType;
而这里的命名来自FileUploadInterceptor中对MultiPartRequestWrapper解析完放置于ActionContext中所作的处理:
见MultiPartRequestWrapper中:
Java代码
if (files != null && files.length > 0) {
List<File> acceptedFiles = new ArrayList<File>(files.length);
List<String> acceptedContentTypes = new ArrayList<String>(files.length);
List<String> acceptedFileNames = new ArrayList<String>(files.length);
String contentTypeName = inputName + "ContentType";
String fileNameName = inputName + "FileName";
for (int index = 0; index < files.length; index++) {
if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation, ac.getLocale())) {
acceptedFiles.add(files[index]);
acceptedContentTypes.add(contentType[index]);
acceptedFileNames.add(fileName[index]);
}
}
if (!acceptedFiles.isEmpty()) {
Map<String, Object> params = ac.getParameters();
params.put(inputName, acceptedFiles.toArray(new File[acceptedFiles.size()]));
params.put(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()]));
params.put(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()]));
}
}
分享到:
相关推荐
解决Struts2上传时候使用UTF-8的冲突问题: * 重新包装了JakartaMultiPartRequest提供Chartset的设置方法。 * 可以通过配置方式对MultiPartRequest中的内容进行编码设定,请在Struts.xml中配置添加struts.multipart...
struts2上传文件进度条显示,里面有详细的代码
Uploadify结合Struts2上传demo
struts2上传下载项目,代码详细,注释清晰,简单易懂
struts2上传图片到Oracle,并进行显示,测试可以成功上传
struts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileupload
Struts2上传图片并生成等比例缩略图的实例,在上传文件的同时生成等比例的缩略图,分放在不同的文件夹下。自己亲测,没有问题。
struts2上传和下载文件详细源码,适合初学者,转载
struts2上传单个文件及多个文件,strus2拦截器的使用,里面有个user用户,先执行user.jsp即登陆,可以执行上传文件的操作,反之,不能,有个exit.jsp,退出之后不能执行。里面含有jar文件,导入myeclipse可以执行...
Jquery+struts2上传图片,制作进度条等示例,还有Jquery+Json+Struts实现Ajax技术,还有图形处理技术等,虽然很少,但都有重点突出,由于我也是学习,所以代码不是很简洁,对想学习交流的朋友非常合适
这个bug是由Struts2上传文件后return SUCCESS后报的错误: java.lang.AbstractMethodError: be.telio.mediastore.ui.upload.GarryMultiPartRequest.cleanUp()V at org.apache.struts2.dispatcher.multipart....
有关struts2上传 有关struts2上传有关struts2上传
struts上传视频与照片可以再后页面显示。支持同时上传。
Struts2上传文件(直接用request)
struts2上传下载实例包含了很多种不同的方法
struts2 struts2上传 struts2上传文件 struts2上传实例 struts上传,随手写的一个Demo,测试可以通过.
ckeditor和struts2实现图片上传和编辑器上浏览!
使用struts2框架的一个文件上传demo。。大家互相学习学习,里面有注释了,觉得好的顶一下吧。
使用struts2 上传图片到项目webapps目录下 然后生成缩略图 返回到页面显示缩略图
struts2上传下载struts2上传下载