上传文件
上传文件需要使用的jar包
- commons-fileupload-1.4.jar
- commons-io-2.6.jar
文档中看的我自己混乱了,这里给出一种使用文件上传的方法。
单文件上传
(一)我们需要定义一个文件Action类,里面有上传下载方法,其中“属性“的定义需要特别注意,
假设说我们前端表单中上传文件的标签的name值为upload,我们需要把属性定义成
private File upload; //获取的文件
private String uploadContentType; //获取的文件的属性
private String uploadFileName; //获取的文件的名字
然后我们给这些属性加上set方法,这样表单提交后对应属性会被注入相应的值
(二)然后我们需要在配置文件中定义一下Action的路由
<action name="upload" class="lf.blank.action.FileAction" method="upload">
<!--配置两个拦截器 如果需要对上传文件类型进行限制 只需在拦截器中添加一些参数-->
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="basicStack"/>
<result>/index.jsp</result>
<result name="input">/error.jsp</result>
</action>
(三)提交表单
<!-- 表单 -->
<s:form action="/file/upload" method="post" enctype="multipart/form-data">
<s:file name="upload" label="文件"/>
<s:submit value="上传"/>
</s:form>
(四)写一下上传函数
/**
* 文件上传
*/
public String upload() {
//filePath是自己定义的存储文件的目录,你可以自己定义一个成员变量,然后在构造函数中初始化
File desFile = new File(filePath, uploadFileName);
try {
FileUtils.copyFile(upload, desFile);
} catch (IOException e) {
e.printStackTrace();
}
return SUCCESS;
}
好了!你可以跑一下代码,看看文件是否真的上传到了你想要上传的目录。
多文件上传
多文件上传其实和单文件上传有异曲同工之妙,我们只需把上面的文件相关的成员变量变成数组行变量,然后在表单中使用同name属性的多个input框,接着在上传业务函数中循环调用上传逻辑即可。
修改过的属性
private File[] upload;
private String[] uploadFileName;
private String[] uploadContentType;
其余步骤不再此赘述。
如果上传时显示空指针异常,请检查属性是否有set方法,如果Action内无细节问题,请设置上传文件最大大小,将值设置的大一些。
下载文件
做下载文件业务时,我们应该先来认识一下stream类型的视图,stream视图是专门用来数据传输的,一般用来下载文件,视图中以输入流形式传输数据。
所以下载文件功能需要配置一个stream类型的结果视图。
<action name="download" class="lf.blank.action.FileAction" method="download">
<result name="download" type="stream">
<!--设置返回给浏览器的类型 一般这样设置-->
<param name="contentType">application/octet-stream</param>
<!--设置下载时显示的文件名-->
<param name="contentDisposition">attachment;filename=${downloadFileName}</param>
</result>
</action>
我们还需要两个属性
private String downloadFileName; //下载的文件的名称,带后缀,用于生成具体文件位置
private InputStream inputStream; //默认的输入流 这个名称也是需要固定 如果改变需要在流视图中配置
然后完成我们的download方法
public String download() {
//生成文件具体路径
File file = new File(filePath, downloadFileName);
try {
//获得文件输入流
inputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//返回流视图
return "download";
}
为了测试,我在单文件上传页面加了一个最近上传文件显示区,代码是这样的
<!-- 显示一下上一次上传的文件 做下载测试用 -->
<s:url action="/file/download" var="download">
<s:param name="downloadFileName"><s:property value="#request.uploadFileName"/></s:param>
</s:url>
<p><a href="${download}"><s:property value="#request.uploadFileName"/></a></p>
下载的演示效果
文末
struts上传文件时如果文件过大,好像会不能上传,鄙人粗浅,尚未有解决办法;
本文仅做各位学习之用,希望能帮助到大家!