文件上传
无论用什么组件上传文件,必须将form的enctype属性设置为multipart/form-data
无论是struts1还是struts2,在上传文件时,不能用get方式提交表单,负责会报错:status 404 No result defined for action xxx and result input
struts1文件上传
struts1文件上传,主要是用到了struts1提供的org.apache.struts.upload.FormFile组件,该组件会主动接受前台页面中type="file"的文件。但是需要注意的是前台页面中, type="file"的组件的name属性的值 必须和自己定义的form组件中,类型是org.apache.struts.upload.FormFile的字段的名称一致,负责,struts1无法将页面中的属性封装成ActionForm。
所以,开发struts1的文件上传功能,需要做的是:开发form组件,form组件需要继承自org.apache.struts.action.ActionForm。在自己form中定义private FormFile theFile;并且页面中type="file"的组件的名称必须是theFile,和form组件中一致。action中和普通action一样。
另外:struts1无法和struts2一样,接受file的类型及其它属性。例如:在form中,添加private String theFileType;private String theFileName;提供get和set方法,是无法将属性注入到这些属性的。只会注入FormFile属性。theFileType和theFileName是空的。
struts1为了保存文件方便,一般会在配置org.apache.struts.action.ActionServlet时,加上如下初始化参数:
<init-param>
<param-name>uploadlocation</param-name>
<param-value>/upload/</param-value>
</init-param>
<init-param>
<param-name>downloadlocation</param-name>
<param-value>/download/</param-value>
</init-param>
在action中,用servlet.getServletConfig().getInitParameter("uploadlocation")来取得配置的参数。servlet是org.apache.struts.action.Action提供的实例。
值得注意的是,和struts1不一样,commons-fileupload.jar组件在完成文件上传的时候,会首先将文件保存成临时文件,然后将临时文件做输入流。而struts1是没有中间临时文件的。
Struts2中直接使用io的File组件接受页面的上传文件。
commons-fileupload组件在封装页面上传的文件的时候,会将文件保存在临时目录,tomcat时,临时目录是F:\Tomcat\Tomcat6.0\work\Catalina\localhost\+项目名称。
在action中定义如下属性
//上传文件
private File upload;
上传文件类型,自动封装
private String uploadContentType;
//上传文件名称,自动封装
private String uploadFileName;
commons-fileupload组件,在封装时,不仅可以吧前台页面的文件封装到File upload中,还可以将文件类型和文件名称封装到uploadContentType和uploadFileName中,值得注意的是uploadContentType和uploadFileName的名称需要遵循规则,负责无法封装。规则是定义的文件名称+ContentType和FileName。
异步上传
异步上传可以采用ajaxfileupload.js组件。action中任然用commons-fileupload.jar组件。
页面中可以用
$.ajaxFileUpload({
url:'${ctx}/common/upload.action',
secureuri : false,
fileElementId:'upfile',
dataType : 'json',
success:function(){
},
error:function(){
}
});
如果异步上传是用<input type="file" name="txtFile" id="upfile"/>,则需要同时使用id属性和name属性。其中,fileElementId指的是页面中type="file"的id属性,在后台中取到的是name属性。
在后台action中,需要用到MultiPartRequestWrapper,struts2举例代码:
MultiPartRequestWrapper request = (MultiPartRequestWrapper) ServletActionContext.getRequest();
Enumeration<String> fileInputIds = request.getFileParameterNames();
// 获取了上传文件表单的id
String fileInputId = fileInputIds.nextElement(); //这里取到的是fileElementId:'upfile'中定义的id='upfile'的属性的name值,这里是txtFile。
String fileNames[] = request.getFileNames(fileInputId); // 上传的原文件名
File files[] = request.getFiles(fileInputId); // 对应的系统临时文件
File uploadfile = files[0];
String filename = fileNames[0];
无论用什么组件上传文件,必须将form的enctype属性设置为multipart/form-data
无论是struts1还是struts2,在上传文件时,不能用get方式提交表单,负责会报错:status 404 No result defined for action xxx and result input
struts1文件上传
struts1文件上传,主要是用到了struts1提供的org.apache.struts.upload.FormFile组件,该组件会主动接受前台页面中type="file"的文件。但是需要注意的是前台页面中, type="file"的组件的name属性的值 必须和自己定义的form组件中,类型是org.apache.struts.upload.FormFile的字段的名称一致,负责,struts1无法将页面中的属性封装成ActionForm。
所以,开发struts1的文件上传功能,需要做的是:开发form组件,form组件需要继承自org.apache.struts.action.ActionForm。在自己form中定义private FormFile theFile;并且页面中type="file"的组件的名称必须是theFile,和form组件中一致。action中和普通action一样。
另外:struts1无法和struts2一样,接受file的类型及其它属性。例如:在form中,添加private String theFileType;private String theFileName;提供get和set方法,是无法将属性注入到这些属性的。只会注入FormFile属性。theFileType和theFileName是空的。
struts1为了保存文件方便,一般会在配置org.apache.struts.action.ActionServlet时,加上如下初始化参数:
<init-param>
<param-name>uploadlocation</param-name>
<param-value>/upload/</param-value>
</init-param>
<init-param>
<param-name>downloadlocation</param-name>
<param-value>/download/</param-value>
</init-param>
在action中,用servlet.getServletConfig().getInitParameter("uploadlocation")来取得配置的参数。servlet是org.apache.struts.action.Action提供的实例。
Struts2文件上传
struts2没有提供自己的请求解析器,也就是说,struts2不会自己区处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来,但struts2在原有的上传解析器上作了进一步封装,更进一步简化了文件上传。Struts2的struts.properties配置文件中,配置struts2的上传文件解析器。
struts.multipart.parser=jakarta (srtuts2默认),也可以设置为常用的cos,pell等。
struts.multipart.parser:该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos、pell和jakarta等属性值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta,即common-fileupload.jar.
注意 如果需要使用cos或者pell的文件上传方式,则应该将对应的JAR文件复制到Web应用中。例如,使用cos上传方式,则需要自己下载cos框架的JAR文件,并将该文件放在WEB-INF/lib路径下。
值得注意的是,和struts1不一样,commons-fileupload.jar组件在完成文件上传的时候,会首先将文件保存成临时文件,然后将临时文件做输入流。而struts1是没有中间临时文件的。
Struts2中直接使用io的File组件接受页面的上传文件。
commons-fileupload组件在封装页面上传的文件的时候,会将文件保存在临时目录,tomcat时,临时目录是F:\Tomcat\Tomcat6.0\work\Catalina\localhost\+项目名称。
在action中定义如下属性
//上传文件
private File upload;
上传文件类型,自动封装
private String uploadContentType;
//上传文件名称,自动封装
private String uploadFileName;
commons-fileupload组件,在封装时,不仅可以吧前台页面的文件封装到File upload中,还可以将文件类型和文件名称封装到uploadContentType和uploadFileName中,值得注意的是uploadContentType和uploadFileName的名称需要遵循规则,负责无法封装。规则是定义的文件名称+ContentType和FileName。
异步上传
异步上传可以采用ajaxfileupload.js组件。action中任然用commons-fileupload.jar组件。
页面中可以用
$.ajaxFileUpload({
url:'${ctx}/common/upload.action',
secureuri : false,
fileElementId:'upfile',
dataType : 'json',
success:function(){
},
error:function(){
}
});
如果异步上传是用<input type="file" name="txtFile" id="upfile"/>,则需要同时使用id属性和name属性。其中,fileElementId指的是页面中type="file"的id属性,在后台中取到的是name属性。
在后台action中,需要用到MultiPartRequestWrapper,struts2举例代码:
MultiPartRequestWrapper request = (MultiPartRequestWrapper) ServletActionContext.getRequest();
Enumeration<String> fileInputIds = request.getFileParameterNames();
// 获取了上传文件表单的id
String fileInputId = fileInputIds.nextElement(); //这里取到的是fileElementId:'upfile'中定义的id='upfile'的属性的name值,这里是txtFile。
String fileNames[] = request.getFileNames(fileInputId); // 上传的原文件名
File files[] = request.getFiles(fileInputId); // 对应的系统临时文件
File uploadfile = files[0];
String filename = fileNames[0];