java中Struts2 的文件上传和下载示例
文件上传
- 表单准备
- 要想使用HTML表单上传一个或多个文件
- 须把HTML表单的enctype属性设置为multipart/form-data
- 须把HTML表单的method属性设置为post
- 需添加<inputtype=“file”>字段.
- Struts对文件上传的支持
- 在Struts应用程序里,FileUpload拦截器和JakartaCommonsFileUpload组件可以完成文件的上传.
- 步骤:
- 在Jsp页面的文件上传表单里使用file标签.如果需要一次上传多个文件,就必须使用多个file标签,但它们的名字必须是相同的
- 在Action中新添加3个和文件上传相关的属性.这3个属性的名字必须是以下格式
- 基本的文件的上传:直接在Action中定义如下3个属性,并提供对应的getter和setter
- [FileName]:类型-File-被上传的文件。例如:data(fileName要求和文件表单项的name一致)
- [FileName]ContentType:类型-String-上传文件的文件类型。例如:dataContentType(用来接收文件类型(MIME值))
- [FileName]FileName:String-上传文件的文件名。例如:dataFileName(用来接收文件的名字)
- 如果上传多个文件,可以使用List
- 若传递多个文件,则上述的3个属性,可以改为List类型!多个文件域的name属性值需要一致.
- 示例代码
<s:formaction="testUpload"enctype="multipart/form-data"> <s:textfieldname="userName[0]"label="用户-1"></s:textfield> <s:filename="photos"label="照片"></s:file> <s:textfieldname="userName[1]"label="用户-2"></s:textfield> <s:filename="photos"label="照片"></s:file> <s:textfieldname="userName[2]"label="用户-3"></s:textfield> <s:filename="photos"label="照片"></s:file> <s:submitvalue="提交"></s:submit> </s:form>
publicclassUploadActionextendsActionSupport{ @Setter@Getter privateList<File>photos; @Setter@Getter privateList<String>photosContentType; @Setter@Getter privateList<String>photosFileName; @Setter@Getter privateList<String>userName; publicStringtestUpload()throwsIOException{ System.out.println("userName:"+userName); System.out.println("photos:"+photos); System.out.println("photosFileName:"+photosFileName); System.out.println("photosContentType:"+photosContentType); //将文件传到服务器根目录下upload文件下 //获取ServletContext ServletContextservletContext=ServletActionContext.getServletContext(); //获取真实路径 StringrealPath=servletContext.getRealPath("/upload"); System.out.println(realPath); FileuploadFile=newFile(realPath); //判断路径是否存在 if(!uploadFile.exists()){ //不存在创建 uploadFile.mkdir(); } for(inti=0;i<photos.size();i++){ UUIDuuid=UUID.randomUUID(); FileUtils.copyFile(photos.get(i),newFile(realPath+"/"+uuid+photosFileName.get(i))); } returnSUCCESS; } }
1.处理几个小问题?
1.文件名重名,一般可以在文件名的前面生成一个UUID作为前缀。
2.限制单个文件的大小
3.限制文件的类型
4.限制总文件的大小
2.在Struts2中提供了FileUpload拦截器可以给我们设置这些属性值
FileUpload拦截器有3个属性可以设置.
- maximumSize:上传单个文件的最大长度(以字节为单位),默认值为2MB
- allowedTypes:允许上传文件的类型,各类型之间以逗号分隔
- allowedExtensions:允许上传文件扩展名,各扩展名之间以逗号分隔
- 可以在struts.xml文件中覆盖这3个属性
注意:在org.apache.struts2下的default.properties中有对上传的文件总的大小的限制.可以使用常量的方式来修改该限制struts.multipart.maxSize=2097152
<constantname="struts.devMode"value="true"/> <!--在这修改总文件的的大小--> <constantname="struts.multipart.maxSize"value="2097152"/> <packagename="default"namespace="/"extends="struts-default"> <interceptors> <interceptor-stackname="myInterceptor"> <interceptor-refname="defaultStack"> <!--修改单个文件大小,CommonsFileUpload组件默认接受上传文件总的最大值为2M--> <paramname="fileUpload.maximumSize">57,408</param> <!--允许上传的文件类型--> <paramname="fileUpload.allowedTypes">image/pjpeg,image/gif</param> <!--允许上传文件的扩展名--> <paramname="fileUpload.allowedExtensions">jpg,gif</param> </interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-refname="myInterceptor"></default-interceptor-ref> <actionname="testUpload"class="org.pan.action.UploadAction"method="testUpload"> <resultname="success">/WEB-INF/views/success.jsp</result> <resultname="input">/upload.jsp</result> </action> </package>
一.上传文件相关的错误消息?
1.与文件上传有关的出错消息在struts-messages.properties文件里预定义.
2.可以在文件上传Action相对应的资源文件或者在i18n_zh_CN.properties国际化资源文件中重新定义错误消息
struts.messages.error.file.too.large=你传的文件太大了 struts.messages.error.content.type.not.allowed=文件类型错误 struts.messages.error.file.extension.not.allowed=扩展名错误 struts.messages.upload.error.SizeLimitExceededException=文件总大小超过上限
文件下载
-
在某些应用程序里,可能需要动态地把一个文件发送到用户的浏览器中,而这个文件的名字和存放位置在编程时是无法预知的
- Stream结果类型
- Struts专门为文件下载提供了一种Stream结果类型.在使用一个Stream结果时,不必准备一个JSP页面.
- Stream结果类型可以设置如下参数:
- contentType:被下载的文件的MIME类型。默认值为text/plain
- contentLength:被下载的文件的大小,以字节为单位
- contentDisposition:可以设置下载文件名的ContentDispositon响应头,默认值为inline,通常设置为如下格式:
- attachment;filename="document.pdf".
- inputName:Action中提供的文件的输入流。默认值为inputStream
- bufferSize:文件下载时缓冲区的大小。默认值为1024
- allowCaching:文件下载时是否允许使用缓存。默认值为true
- contentCharSet:文件下载时的字符编码。
- 以上参数可以在Action中以getter方法的方式提供!
- 以上参数可以在Action中以getter方法的方式提供!
- Stream结果类型的参数可以在Action以属性的方式覆盖
- 具体使用细节参看struts-2.3.15.3-all/struts-2.3.15.3/docs/WW/docs/stream-result.html
-
示例代码
<ahref="testDownLoad">下载</a>
publicclassDownLoadActionextendsActionSupport{ //通常以下这几个参数会在Action中提供 @Setter@Getter privateStringcontentType; @Setter@Getter privatelongcontentLength; @Setter@Getter privateStringcontentDisposition; @Setter@Getter privateInputStreaminputStream; publicStringtestDownLoad()throwsFileNotFoundException,UnsupportedEncodingException{ //获取ServletContext ServletContextservletContext=ServletActionContext.getServletContext(); //获取文件的路径 StringrealPath=servletContext.getRealPath("/WEB-INF/file/至少还有你.mp3"); //获取文件的流 inputStream=newFileInputStream(realPath); //设置文件的类型 contentType=servletContext.getMimeType(realPath); //获取文件的长度 contentLength=newFile(realPath).length(); //设置文件名 StringfileName="至少还有你.mp3"; fileName=newString(fileName.getBytes("gbk"),"iso8859-1"); contentDisposition="attachment;filename="+fileName; returnSUCCESS; } }
<!--文件下载--> <actionname="testDownLoad"class="org.pan.action.DownLoadAction"method="testDownLoad"> <resulttype="stream"> <!--文件缓冲大小--> <paramname="bufferSize">2048</param> </result> </action>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。