学科分类
目录
SSM框架

实现文件下载

文件下载就是将文件服务器中的文件下载到本机上。在Spring MVC环境中,实现文件下载大致可分为如下两个步骤:

(1)在客户端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法以及文件名(需要先在文件下载目录中添加了一个名称为“1.jpg”的文件),具体代码示例如下:

<a href="${pageContext.request.contextPath }/download?filename=1.jpg">
    文件下载 
</a>

(2)在后台Controller类中,使用Spirng MVC提供的文件下载方法进行文件下载。Spirng MVC提供了一个ResponseEntity类型的对象,使用它可以很方便的定义返回的HttpHeaders对象和HttpStatus对象,通过对这两个对象的设置,即可完成下载文件时所需的配置信息。文件下载的示例代码如下所示。

@RequestMapping("/download")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
                                           String filename) throws Exception{
    // 指定要下载的文件所在路径
    String path = request.getServletContext().getRealPath("/upload/");
    // 创建该文件对象
    File file = new File(path+File.separator+filename);
    // 设置响应头
    HttpHeaders headers = new HttpHeaders();
    // 通知浏览器以下载的方式打开文件
    headers.setContentDispositionFormData("attachment", filename);
    // 定义以流的形式下载返回文件数据
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    // 使用Sring MVC框架的ResponseEntity对象封装返回下载数据
   return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
                                                       headers,HttpStatus.OK);
}

在fileDownload()方法中,首先根据文件路径和需要下载的文件名来创建文件对象,然后对响应头中文件下载时的打开方式以及下载方式进行了设置,最后返回了ResponseEntity封装的下载结果对象。

​ ResponseEntity对象有些类似前面章节介绍的@ResponseBody注解,它用于直接返回结果对象。上面示例中,设置响应头信息中的MediaType代表的是Interner Media Type(即互联网媒体类型),也叫做MIME类型,MediaType.APPLICATION_OCTET_STREAM的值为application/octet-stream,即表示以二进制流的形式下载数据;HttpStatus类型代表的是Http协议中的状态,示例中的HttpStatus.OK表示200,即服务器已成功处理了请求。

在Eclipse的WebContent目录下,创建一个页面文件download.jsp,将上述第(1)步的页面代码编写到download.jsp中,然后将第(2)步的fileDownload()方法编写在FileUploadController类中。发布项目并启动Tomcat服务器,在浏览器中访问地址 http://localhost:8080/chapter16/download.jsp,其显示效果如图1所示。

图1 fileDownload.jsp文件下载页面

单击图1中的“文件下载”链接后,会出现下载提示弹窗,如图2所示(这里以火狐浏览器为例进行演示)。

图2 文件下载弹窗

选择图2中的“保存文件”并单击“确定”按钮后,即可下载该文件。

点击此处
隐藏目录