温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
第17章
文件的上传和下载
17
文件
上传
下载
第17章 文件的上传和下载,主要内容 单文件上传 多文件上传 文件下载,17.1 文件上传,Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。,17.1.1 commons-fileupload组件,由于Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传。因此,需要将commons-fileupload组件相关的jar(commons-fileupload-1.3.1.jar和commons-io-2.4.jar)拷贝到Spring MVC应用的WEB-INF/lib目录下。下面讲解一下如何下载相关jar包。,commons-fileupload组件可以从http:/commons.apache.org/proper/commons-fileupload/上下载,本书采用的版本是1.3.1。下载它的Binaries压缩包(commons-fileupload-1.3.1-bin.zip),解压后的目录中有两个子目录,分别是lib和site。lib目录下有个JAR文件:commons-fileupload-1.3.1.jar,该文件是commons-fileupload组件的类库。site目录中是commons-fileupload组件的文档,也包括API文档。commons-fileupload组件依赖于Apache的另外一个项目:commons-io,该组件可以从http:/commons.apache.org/proper/commons-io/上下载,本书采用的版本是2.4。下载它的Binaries压缩包(commons-io-2.4-bin.zip),解压缩后的目录中有四个JAR文件,其中有一个commons-io-2.4.jar文件,该文件是commons-io的类库。,17.1.2 基于表单的文件上传,基于表单的文件上传,不要忘记使用enctype属性,并将它的值设置为multipart/form-data。同时,表单的提交方式设置为post。为什么需要这样呢?下面从enctype属性说起。表单的enctype属性指定的是表单数据的编码方式,该属性有如下三个值:application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的value属性值。multipart/form-data:该编码方式以二进制流的方式来处理表单数据,并将文件域指定文件的内容封装到请求参数里。text/plain:该编码方式当表单的action属性为mailto:URL的形式时才使用,主要适用于直接通过表单发送邮件的方式。由上面三个属性的解释可知,基于表单上传文件时,enctype的属性值应为multipart/form-data。,17.1.3 MultipartFile接口,在Spring MVC框架中,上传文件时,将文件相关信息及操作封装到MultipartFile对象中。因此,开发者只需要使用MultipartFile类型声明模型类的一个属性,即可以对被上传文件进行操作。该接口具有如下方法:byte getBytes():以字节数组的形式返回文件的内容。String getContentType():返回文件的内容类型。InputStream getInputStream():返回一个InputStream,从中读取文件的内容。String getName():返回请求参数的名称。String getOriginalFilename():返回客户端提交的原始文件名称。long getSize():返回文件的大小,单位为字节。boolean isEmpty():判断被上传文件是否为空。void transferTo(File destination):将上传文件保存到目标目录下。上传文件时,需要在配置文件中使用Spring的mons.CommonsMultipartResolver类配置MultipartResolver 用于文件上传。,17.1.4 单文件上传,创建应用ch17,将Spring MVC相关JAR包、commons-fileupload组件相关JAR包以及JSTL相关JAR包导入应用的lib中,如图17.1所示。,3创建文件选择页面,在WebContent目录下,创建JSP页面oneFile.jsp。,选择文件:文件描述:,4创建POJO类,在src目录下,创建包pojo,在该包中创建POJO类FileDomain。在该POJO类中声明一个MultipartFile类型的属性,封装被上传的文件信息,属性名与文件选择页面oneFile.jsp中的file类型的表单参数名myfile相同。具体代码如下:package pojo;import org.springframework.web.multipart.MultipartFile;public class FileDomain private String description;private MultipartFile myfile;/省略setter和getter方法,5创建控制器类,在src目录下,创建controller包,并在该包中创建FileUploadController控制器类。,RequestMapping(/onefile)public String oneFileUpload(ModelAttribute FileDomain fileDomain,HttpServletRequest request)String realpath=request.getServletContext().getRealPath(uploadfiles);String fileName=fileDomain.getMyfile().getOriginalFilename();File targetFile=new File(realpath,fileName);if(!targetFile.exists()targetFile.mkdirs();/上传 try fileDomain.getMyfile().transferTo(targetFile);logger.info(成功);catch(Exception e)e.printStackTrace();return showOne;,6创建Spring MVC的配置文件,上传文件时,需要在配置文件中使用spring的CommonsMultipartResolver类 配置MultipartResolver 用于文件上传。,7创建成功显示页面,$fileDomain.description$fileDomain.myfile.originalFilename,17.1.5 多文件上传,本小节继续通过ch17应用案例讲解Spring MVC框架如何实现多文件上传。具体步骤如下:,1创建多文件选择页面,选择文件1:文件描述1:选择文件2:文件描述2:选择文件3:文件描述3:,2创建POJO类,上传多文件时,需要POJO类MultiFileDomain封装文件信息,MultiFileDomain类的具体代码如下:package pojo;import java.util.List;import org.springframework.web.multipart.MultipartFile;public class MultiFileDomain private List description;private List myfile;/省略setter和getter方法,3添加多文件上传处理方法,RequestMapping(/multifile)public String multiFileUpload(ModelAttribute MultiFileDomain multiFileDomain,HttpServletRequest request)String realpath=request.getServletContext().getRealPath(uploadfiles);/String realpath=D:/spring mvc workspace/ch7/WebContent/uploadfiles;File targetDir=new File(realpath);if(!targetDir.exists()targetDir.mkdirs();List files=multiFileDomain.getMyfile();for(int i=0;i files.size();i+)MultipartFile file=files.get(i);String fileName=file.getOriginalFilename();File targetFile=new File(realpath,fileName);/上传 try file.transferTo(targetFile);catch(Exception e)e.printStackTrace();logger.info(成功);return showMulti;,4创建成功显示页面,详情文件名$description$multiFileDomain.myfileloop.count-1.originalFilename,5测试文件上传,17.2 文件下载,利用程序实现下载需要设置两个报头:1Web服务器需要告诉浏览器其所输出内容的类型不是普通文本文件或HTML文件,而是一个要保存到本地的下载文件。设置Content-Type 的值为:application/x-msdownload。2Web服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置Content-Disposition报头。该报头指定了接收程序处理数据内容的方式,在HTTP应用中只有attachment是标准方式,attachment表示要求用户干预。在attachment后面还可以指定filename参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。设置报头的示例如下:response.setHeader(Content-Type,application/x-msdownload);response.setHeader(Content-Disposition,attachment;filename=+filename);,下面继续通过ch17讲述利用程序实现下载的过程。要求从17.1节上传文件的目录(workspace.metadata.pluginsorg.eclipse.wst.server.coretmp0wtpwebappsch7uploadfiles)中下载文件。,1编写控制器类,首先编写控制器类FileDownController,该类中有3个方法:show、down和toUTF8String。show方法获取被下载的文件名称;down方法执行下载功能;toUTF8String方法是下载保存时中文文件名字符编码转换方法。,2创建文件列表页面,被下载的文件名$filename,3测试下载功能,发布ch17应用到Tomcat服务器,并启动Tomcat服务器。然后,通过地址http:/localhost:8080/ch17/showDownFiles测试下载示例,运行结果如图17.6所示。,