一、struts2 文件上传
使用struts2 进行文件上传非常简单,只需要简单的几歩即可完成:
1). 页面上<form></form> 表单上要加上 method="post" enctype="multipart/form-data" 属性;
2). 上传的标签为 <input type="file" name="***">;
3). 项目中必须要包含 common-fileupload.jar和common-io.jar 两个 jar;
4). 可以在 struts.xml 文件中配置一些常用属性,来限制上传文件的类型、大小(默认为 2M)等:
<!-- 上传文件的大小,单位是 B(Byte)这里是5M-->
<param name="fileUpload.maximumSize">5242880</param>
<!-- 上传文件的扩展名 -->
<param name="fileUpload.allowedExtensions">
<span style="white-space:pre"> </span>.jpg,.jpeg,.png,.bmp,.gif,.ico,.dll,.psd,
<span style="white-space:pre"> </span>.txt,.rar,.zip,.java,.chm,.doc,.docx,.pdf,.xls,.xlsx,.ppt
</param>
<!-- 文件的内容类型 -->
<param name="fileUpload.allowedTypes">
<span style="white-space:pre"> </span>image/jpg,image/jpeg,image/png,image/bmp,image/gif,image/x-icon
<span style="white-space:pre"> </span>text/plain,application/zip,text/css,application/msword
</param>
5). 在 Action 中定义属性:
private File xxx; // 用户上传的资源
private String xxxFileName; // 文件名,必须以 FileName 结尾
private String xxx<span style="font-family: Arial; font-size: 14px; line-height: 26px;">ContentType; //上传文件的MIME类型;</span>
省略getter/setter
这些属性都会随着文件的上传自动赋值;
在项目中新建一个 upload 文件夹,上传的文件即保存在此文件夹中,在程序中我们需要先得到 upload 文件夹在服务器上的真实地址。
具体 Action 代码如下:
// 得到 uplode 文件夹在服务器上的真实路径
String dir = servletContext.getRealPath("/upload");
// 以当前用户(用户名+id)作为文件夹名,即每个用户上传的资源都存在单独的文件夹中
String userResPath = dir + File.separator + user.getUsername() + user.getId()
+ File.separator;
File userFolder = new File(userResPath);
if (!userFolder.exists()) { // 如果文件夹不存在就创建文件夹
userFolder.mkdir();
} // 如果文件夹存在就上传文件
// 文件扩展名
String ext = userResFileName.substring(userResFileName.lastIndexOf("."));
// 纳秒时间作为文件名(防止重名)
long l = System.nanoTime();
// 新文件路径
File newFile = new File(userFolder, l + ext);
try {
FileUtils.copyFile(userRes, newFile);
} catch (IOException e) {
e.printStackTrace();
}
二、struts2 文件下载
struts2的 stream 结果类型专门用于实现文件下载;在 Action 中需要声明以下变量以及它们的 getter 方法:
private String contentType;//下载的结果类型
private long contentLength;//下载的文件长度
//此响应头指定响应是文件下载类型,一般取值为attachment;filename=""
private String contentDisposition;
private InputStream inputStream;
然后在执行下载的方法中,为这些变量赋值
contentType = "application/octet-stream;charset=utf-8";
contentDisposition = "attachment;filename="+downName;
inputStream = new FileInputStream(filename);
其中的downName即为将要下载的文件的名称,可根据需要动态指定。由于不知道要下载的文件的具体类型,因此可指定 contentType = "application/octet-stream;charset=utf-8",charset指定下载文件使用的编码方式。具体action代码如下:
public String downloadResource(){
model = resourceService.getResourceById(rid);
String filename = servletContext.getRealPath(model.getResPath());
String downName;
try {
//为文件名编码,防止中文乱码
downName = URLEncoder.encode(model.getResName(), "utf-8");
contentType = "application/octet-stream;charset=utf-8";
contentDisposition = "attachment;filename="+downName;
inputStream = new FileInputStream(filename);
contentLength = inputStream.available();
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS;
}
struts.xml 文件中对应的 result 配置为:
<result name="success" type="stream">
<span style="white-space:pre"> </span><param name="bufferSize">2048</param>
</result>
以上即为基本的使用struts2进行文件的上传与下载。如果要限制上传的文件类型而又不知道对应的 MIME 类型,可以在 tomcat 的安装目录下的 web.xml 文件中查找,里面包含了几乎所有文件的 MIME 类型。