你可以设置struts2上传文件的最大值。。struts2默认上传文件的最大值是。。
今天使用struts2的文件上传控件时,在struts.xml中,将处理上传的action中的fileupload拦截器的maximumsize参数设置为5000000,上传了一个3m的文件后发现控制台报错,而且提示说文件超过2m。struts.xml相关配置如下:
/fileuploadresult.jsp /fileupload.jsp 500000 application/vnd.ms-powerpoint
后来尝试在struts.xml中加入
发现一切正常了,不报错了。功能也正常了。
发现struts.multipart.maxsize和fileupload拦截器的maximumsize属性分工不同,总结如下:
1.struts.multipart.maxsize掌控整个项目所上传文件的最大的size。超过了这个size,后台报错,程序处理不了如此大的文件。fielderror里面会有如下的提示:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileupload拦截器的maximumsize属性必须小于struts.multipart.maxsize的值。
struts.multipart.maxsize默认2m,当maximumsize大于2m时,必须设置struts.multipart.ma
包括action 和 http-request两种方式上传成功回调方法 绑定 handleSuccess 方法
自定义上传相比action上传,扩展性更强,当项目里上传需求较多,且连接不同接口地址时,配置uploadheaders 配置很多显然不太优雅。
注意:自定义上传时,需要对该上传设置一下请求头 。 在拦截器里设置请求头
自定义上传的触发方式 ,点击确定时在 importUser 里执行,执行这句即是执行uploadFile方法
注意: formdata打印不出来,实际有值
/**上传文件
*/
public class FileAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
try {
FileForm fileform = (FileForm) form
//取得请求的文件集合
Hashtable hash = fileform.getMultipartRequestHandler().getFileElements()
//得到hashtable的枚举值
Enumeration enu = hash.elements()
//如果该枚举值包含有其它的文件
while(enu.hasMoreElements()) {
//得到文件
FormFile file = (FormFile) enu.nextElement()
System.out.println(file)
add(file)
}
return mapping.findForward("yes")
} catch (Exception e) {
e.printStackTrace()
}
return super.execute(mapping, form, request, response)
}
public void add(FormFile file){
try {
//取得写文件的目录
String url=servlet.getServletContext().getRealPath("upload")
File f1=new File(url)
if(!f1.exists()){//如果文件目录不存在
f1.mkdirs()//创建目录
}
String fileName=file.getFileName()
//创建一个文件输入流
InputStream is=file.getInputStream()
OutputStream out=new FileOutputStream(url+"/"+fileName)
int byteRead=0
byte[] by=new byte[8192]
while((byteRead=is.read(by, 0, 8192))!=-1){
out.write(by, 0, byteRead)
}
out.close()
is.close()
file.destroy()
} catch (Exception e) {
e.printStackTrace()
}
}
}
/**
下载文件
*/
页面一开始进去action,action负责把file文件夹下的所有文件读入一个ArrayList中
Action代码如下:
ArrayList list = new ArrayList()
String path=request.getRealPath("/")+"file"
String FullPath
//System.out.println(path)
myDir=new File(path)
list.clear()
contents=myDir.listFiles()
for(int i=0i<contents.lengthi++){
FullPath=contents.getName()
list.add(FullPath)
//System.out.println(FullPath)
}
request.setAttribute("list",list)
ActionForward forward=new ActionForward("/download.jsp")
return forward
然后进入download.jsp中,这个页面主要负责把所有文件显示,并提供下载连接,代码如下:
<%@ page language="java" contentType="text/htmlcharset=GBK" import="java.util.ArrayList"%>
<head>
</style>
</head>
<body>
<%ArrayList list=(ArrayList)request.getAttribute("list")
for(int i=0i<list.size()i++)
{
String a=java.net.URLEncoder.encode((String)list.get(i))
out.print("<a href=./loaded.do?name="+a+">"+list.get(i)+"</a><br>")
}
%>
</body>
</html>
注意,下划线画中的代码的作用,就是解决问题的所在。
接下来可以直接传入到loadedaction中,也可以通过一个form,我演示的是通过一个form
Form代码如下
package org.aeolus.struts.form
import javax.servlet.http.HttpServletRequest
import org.apache.struts.action.ActionErrors
import org.apache.struts.action.ActionForm
import org.apache.struts.action.ActionMapping
public class LoadForm extends ActionForm {
/*
*Generated Methods
*/
private String name
public String getName() {
return name
}
public void setName(String name) {
this.name = name
}
}
接下来就是action的代码
LoadForm doc=(LoadForm)form
String docName = new String(doc.getName().getBytes("8859_1"))
File f
if(docName!=""){
String docFullPath=request.getRealPath("/")
f = new File(docFullPath+"file\\"+docName)
response.reset()
response.setContentType("application/x-msdownloadcharset=GBK")
System.out.print(response.getContentType())
response.setCharacterEncoding("UTF-8")
docName=java.net.URLEncoder.encode(docName,"UTF-8")
response.setHeader("Content-Disposition", "attachmentfilename=" +new String(docName.getBytes("UTF-8"),"GBK"))
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f))
byte[] buf = new byte[1024]
int len = 0
OutputStream out = response.getOutputStream()
while((len = br.read(buf)) >0)
out.write(buf,0,len)
out.close()
response.wait()
ActionForward forward=new ActionForward("/download.jsp")
return forward }
return null
注意,下划线画中的代码的作用,就是解决问题的所在。说明一下:
response.setCharacterEncoding("UTF-8")
docName=java.net.URLEncoder.encode(docName,"UTF-8")
response.setHeader("Content-Disposition", "attachmentfilename=" +new String(docName.getBytes("UTF-8"),"GBK"))
如果不这样做你将要下载的文件名是乱码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)