上传
在Action里
private File abcFile;private String abcFileName;//这两个参数是可选的
private String abcContentType;//这两个参数是可选的
然后生成set方法
当表单提交之后 如果有上传文件的话 上面三个值就已经自动设置好了
如果有多个文件 假设都是 <input type="file" name="abc" />
那只要将上面3个都改成数组或List就行了
关于上传文件类型 和大小限制等 参见fileUpload拦截器
<action name="sc" class="ssh.action.UploadAction" method="m1">
<result>/success.jsp</result>
<result name="input">/upload.jsp</result>
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">5242880</param><!-- 5MB --> 单个文件最大5MB
<!-- <param name="fileUpload.allowedTypes"></param> -->
<param name="fileUpload.allowedExtensions">zip,rar</param>//后缀名只能是zip或rar
</interceptor-ref>
</action>
另外还需要再struts.xml里
<constant name="struts.multipart.maxSize" value="20971520"/>//总的大小不超过20MB
upload.jsp 片段
<s:debug/>
<s:fielderror value="abc"/>
<form action="sc" method="post" enctype="multipart/form-data">
<input type="file" name="abc" />
<input type="file" name="abc" />
<input type="file" name="abc" />
<input type="file" name="abc" />
<input type="file" name="abc" />
<input type="submit" value="submit" />
</form>
Action 片段
public String m1() {
if (abc != null) {
for (int i = 0; i < abc.length; ++i) {//可以发现实际提交了几个 长度就为几
System.out.println( abc[i].getName() + " " + abcFileName[i] + " " + abcContentType[i] );
}
}
return SUCCESS;
}
下载
假设在你的Action中有一个叫
abcStream的属性 (有getAbcStream()方法 返回InputStream)
在配置文件里
<action name="download" class="xxx" method="yyy">
<result type="stream">//这里有部分值是写死的 可以考虑用ognl表达式动态设置
<param name="contentType">image/jpeg</param>//表明打开/下载的是图片
<param name="inputName">abcStream</param>//写流的名字
<!-- 如果是inline就是在浏览器中打开 -->
<param name="contentDisposition">attachment;filename="xxx.jpg"</param>//提示浏览器打开下载窗口,文件名是xxx.jpg
<param name="bufferSize">1024</param>//缓存大小 默认就是1024 不设置也行
<param name="contentLength ">${contentLength}</param>//内容的长度 这里使用了ognl表达式 所以在相应的Action里有一个contentLength属性
//如果不设置这个值,则下载的时候看不到文件的总大小
</result>
</action>
如果下载文件名有中文 则需要 <param name="contentDisposition">attachment;filename="${@java.net.URLEncoder@encode('测试.jpg','utf-8')}"</param>