- 文件上传、下载
基于表单的文件上传。
Commons-fileupload
-
- Commons-FileUpload组件
Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目。
Commons-FileUpload组件特点:
- 使用简单:可以方便地嵌入到JSP文件中,编写少量代码即可完成文件的上传功能
- 能够全程控制上传内容
- 能够对上传文件的大小、类型进行控制
- 引入依赖(导包)
http://jakarta.apache.org/commons/fileupload/ –下载commons-fileupload-1.2-bin.zip文件 –解压后得到commons-fileupload-1.2.jar
http://jakarta.apache.org/commons/io/ –下载commons-io-1.3.2-bin.zip文件 –解压后得到commons-io-1.3.2.jar |
注意:如果使用Maven创建项目并引入struts核心依赖包的(Struts-core),已包含有FileUpload包。
-
- Web表单
文件上传页面upload.jsp:
<%@ taglib uri="/struts-tags" prefix="s"%> <body> <!-- 传统写法 --> <form action="uploads" method="post" enctype="multipart/form-data"> <!--注意:file控件的name与Action中的File要一致--> 文件:<input type="file" name="uploadImage"> <input type="submit" value="提交"> </form>
<!-- Struts标签库写法 --> <s:form action="uploads" method="post" enctype="multipart/form-data"> <s:file name="uploadImage" label="选择上传的文件" /> <s:submit value="上传" /> </s:form> </body> |
注意:上面是基于表单的上传,在form标签中有两个重点属性:
- method表单提交方式必须为“post”;
- 必须为表单添加enctype值,并设置为:multipart/form-data。
- 上传Action类UploadAction(简单的保存文件方式)
package com.struts; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport { //得到上传的文件(要与form表单中file控件名一致) private File uploadImage; //得到文件的类型 private String uploadImageContentType; //得到文件的名称 private String uploadImageFileName; // 此处省略set和get方法
public String execute(){ //文件名使用时间戳+扩展名 this.setUploadImageFileName(System.currentTimeMillis() + this.getUploadImageFileName().substring(this.getUploadImageFileName().lastIndexOf(".")));
System.out.println("文件名:" + this.getUploadImageFileName()); System.out.println("文件类型:" + this.getUploadImageContentType()); System.out.println("文件对象:" + this.getUploadImage());
//获取要保存文件夹的物理路径(绝对路径) String realPath = ServletActionContext.getServletContext().getRealPath("/upload"); //http://localhost:8080/T214_struts1/upload/a.jpg File file = new File(realPath); //测试此抽象路径名表示的文件或目录是否存在。若不存在,创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 if(!file.exists()){ file.mkdirs(); } try { //保存文件 FileUtils.copyFile(uploadImage, new File(file, uploadImageFileName)); } catch (IOException e) { e.printStackTrace(); } return SUCCESS; } } |
-
- 配置Struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 要注意Struts2默认文件上传最大为2M即便你设置了 <param name="maximumSize">5242880</param> 当上传的文件大于2M时候也会出错的这时要设置,另外一个常量 <constant name="struts.multipart.maxSize" value="1000000000"/> -->
<package name="Struts2" extends="struts-default" namespace="/"> <action name="uploads" class="com.struts.UploadAction"> <!-- 指定(限制)上传文件的类型,定义局部拦截器,修改默认拦截器的属性 "fileUpload.maximumSize" :限制上传最大的文件大小。 "fileUpload.allowedTypes":允许上传文件的类型。 "fileUpload.allowedExtensions":允许上传文件的可扩展文件类型。 -->
<!--配置fileUpload的拦截器 --> <interceptor-ref name="fileUpload"> <!--配置允许上传的文件类型 --> <param name="allowedTypes">application/vnd.ms-excel,image/bmp,image/png,image/gif,image/jpeg</param> <!--配置允许上传的文件大小单位字节 --> <param name="maximumSize">5242880</param> <param name="fileUpload.allowedExtensions">.jpg,.txt,.ppt</param> </interceptor-ref> <interceptor-ref name="defaultStack" /> <result>/success.jsp</result>
<!-- 出现错误自动会返回input结果,进入结果视图 --> <result name="input" >/error.jsp</result>
</action> </package> </struts> |
附加:contentType类型设置
-
- 前端
Success.jsp:
<body> 成功页面 </body> |
Error.jsp:
<!-- 引入struts2的标签库 --> <% @ taglib uri="/struts-tags" prefix="s" %> <body> 跳转错误页面…<br> <!-- fielderror标签输出action的fieldErrors属性保存的字段错误,fieldErrors是一个map类型的属性--> <s:fielderror /> <!-- 生产一个查看debug信息的链接 --> <s:debug /> </body> |
-
- 多文件上传
- 先修改form表单页,改成H5,去掉jsp页面中的
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
改为:<!DOCTYPE html>或全部删除。
同时为file控件添加:multiple属性,如:
<input type="file" name="uplaodFile" multiple="multiple" />
- 将Action中的三个属性全部改成数组,并封装,同时获取里面的文件名和类型等。如:
package com.zking.struts2;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import lombok.Data;
@Data
public class Uploa1dAction2 {
//得到上传的文件要与form表单中的file名要一致
private File[] uploadImage;
//得到文件的类型
private String[] uploadImageContentType;
//得到文件的名称
private String[] uploadImageFileName;
public String execute() {
//文件名使用时间戳+拓展名
for (int i = 0; i <getUploadImage().length; i++) {
String a = UUID.randomUUID().toString();
String b = a+this.getUploadImageFileName()[i];
System.out.println("文件名:"+this.getUploadImageFileName()[i]);
System.out.println("文件类型:"+this.getUploadImageContentType()[i]);
System.out.println("文件对象:"+this.getUploadImage()[i]);
//获取要保存文件夹的物理路径(绝对路径)
String realPath=ServletActionContext.getServletContext().getRealPath("/upload");
//http://localhost:8080/T214_struts1/upload/a.jpg
File file=new File(realPath);
if(!file.exists()) {
file.mkdirs();
}
try {
//保存文件
FileUtils.copyFile(uploadImage[i],new File(file, b));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "success";
}
}