原理:
表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:
1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。
文件上传是web应用经常用到的一个知识。原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。
在Java领域中,有两个常用的文件上传项目:一个是Apache组织Jakarta的Common-FileUpload组件([url]http://commons.apache.org/fileupload/[/url]),另一个是Oreilly组织的COS框架([url]http://www.servlets.com/cos/[/url])。利用这两个框架都能很方便的实现文件的上传。
Strtus上传文件==================================
1,所需jars
2, JSP 代码 ,注意:enctype="multipart/form-data"
<body> <form action="fileupload.action" method="post" enctype="multipart/form-data"> 上传文件 <input type="file" name="targetFile" /> <br /> <input type="submit" value="上传"> </form> </body>
3,UploadAction.java
//注意:上传下载中一定要继承ActionSupport.否则INPUT无法识别 public class UploadAction extends ActionSupport{ private File targetFile; // 上传文件时候的缓存文件, // 必须和jsp中<input file>的name属性相同 private String targetFileFileName; // file的name+FileName; private String targetFileContentType; // file的name+ContentType; public String execute() { System.out.println(targetFile.getPath()); System.out.println(targetFileFileName); // 得到文件名 System.out.println(targetFileContentType); String destPath = ServletActionContext.getServletContext().getRealPath( "/upload"); try { InputStream is = new FileInputStream(targetFile); OutputStream os = new FileOutputStream(new File(destPath, targetFileFileName)); int b = -1; byte[] buff = new byte[1024]; while ((b = is.read(buff)) != -1) { os.write(buff, 0, b); } os.flush(); os.close(); is.close(); } catch (Exception e) { e.printStackTrace(); return ERROR; } return SUCCESS; } // getter/setter....DownLoad.java
public class DownloadAction extends ActionSupport { private String filename; // 省略getter.setter方法 // 去掉get,首字母小写得到tagetFileName, // 这个名字要和struts.xml中的 // <result type="stream"> 标签中的<param name="inputName">的值一直 //他是获取下载文件流的入口方法 public InputStream getTagetFileName() { InputStream is = ServletActionContext.getServletContext() .getResourceAsStream("/upload/" + filename); return is; } @Override public String execute() throws Exception { return SUCCESS; } }
4,Struts.xml文件编写
<struts> <constant name="struts.devMode" value="true" /> <constant name="struts.action.extension" value="do,action,,"></constant> <!-- 设置上传文件的大小最大是5M --> <constant name="struts.multipart.maxSize" value="5242880"></constant> <package name="default" namespace="/" extends="struts-default"> <action name="fileupload" class="com.tarena.web.UploadAction"> <!-- 引用系统默认拦截器,限制上传文件的类型 --> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/png,image/jpeg,audio/mp3</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result><!-- 执行异常跳转的页面 --> <result name="input">/fail.jsp</result> <!-- 如果上传尺寸超标或者类型错误,则跳转到此页面。 --> </action> <!-- 文件下载设置 --> <action name="filedownload" class="com.tarena.web.DownloadAction"> <result type="stream"> <!-- 图片的返回类型是个流 --> <!-- 指定文件以附件形式下载 ,${filename}是DownloadAction.java中定义的输出属性,这里是指定下载文件的名字--> <param name="contentDisposition">attachment;filename="${filename}"</param> <!-- 获取要下载的文件,该文件名一定要在Action中提供其getter方法。 --> <param name="inputName">tagetFileName</param> <!-- 设置要下载的文件大小--> <param name="bufferSize">2048</param> </result> </action> </package> <!-- Add packages here --> </struts>
5,测试地址:localhost:8008/struts2_fileUpload/filedownload.action?filename=0.jpg
附件下载:
文章参考:http://blog.csdn.net/lisa0220/article/details/6400767