spring mvc文件下载-亚博电竞手机版

本节主要讲解 spring mvc 文件下载的实现方法和实现过程。

文件下载的实现方法

实现文件下载有以下两种方法:
  • 通过超链接实现下载。
  • 利用程序编码实现下载。
通过超链接实现下载固然简单,但暴露了下载文件的真实位置,并且只能下载存放在 web 应用程序所在的目录下的文件。 利用程序编码实现下载可以增加安全访问控制,还可以从任意位置提供下载的数据,可以将文件存放到 web 应用程序以外的目录中,也可以将文件保存到数据库中。 利用程序实现下载需要设置两个报头: 1)web 服务器需要告诉浏览器其所输出内容的类型不是普通文本文件或 html 文件,而是一个要保存到本地的下载文件,这需要设置 content-type 的值为 application/x-msdownload。 2)web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 content-disposition 报头。 该报头指定了接收程序处理数据内容的方式,在 http 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。 设置报头的示例如下:

response.setheader("content-type", "application/x-msdownload"); response.setheader("content-disposition", "attachment;filename=" filename);

文件下载的过程

下面继续通过 springmvcdemo11 应用讲述利用程序实现下载的过程,要求从《spring mvc单文件上传》上传文件的目录(workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\springmvcdemo11\uploadfiles)中下载文件,具体开发步骤如下:

1)编写控制器类

首先编写控制器类 filedowncontroller,在该类中有 3 个方法,即 show、down 和 toutf8string。其中,show 方法获取被下载的文件名称;down 方法执行下载功能;toutf8string 方法是下载保存时中文文件名的字符编码转换方法。 filedowncontroller 类的代码如下:
 package controller;  import java.io.file; import java.io.fileinputstream; import java.io.unsupportedencodingexception; import java.util.arraylist; import javax.servlet.servletoutputstream; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestparam;  @controller public class filedowncontroller {     // 得到一个用来记录日志的对象,在打印时标记打印的是哪个类的信息     private static final log logger = logfactory             .getlog(filedowncontroller.class);      /**      * 显示要下载的文件      */     @requestmapping("showdownfiles")     public string show(httpservletrequest request, model model) {         // 从 workspace\.metadata\.plugins\org.eclipse.wst.server.core\         // tmp0\wtpwebapps\springmvcdemo11\下载         string realpath = request.getservletcontext()                 .getrealpath("uploadfiles");         file dir = new file(realpath);         file files[] = dir.listfiles();         // 获取该目录下的所有文件名         arraylist filename = new arraylist();         for (int i = 0; i < files.length; i  ) {             filename.add(files[i].getname());         }         model.addattribute("files", filename);         return "showdownfiles";     }      /**      * 执行下载      */     @requestmapping("down")     public string down(@requestparam string filename,             httpservletrequest request, httpservletresponse response) {         string afilepath = null; // 要下载的文件路径         fileinputstream in = null; // 输入流         servletoutputstream out = null; // 输出流         try {             // 从workspace\.metadata\.plugins\org.eclipse.wst.server.core\             // tmp0\wtpwebapps下载             afilepath = request.getservletcontext().getrealpath("uploadfiles");             // 设置下载文件使用的报头             response.setheader("content-type", "application/x-msdownload");             response.setheader("content-disposition", "attachment; filename="                       toutf8string(filename));             // 读入文件             in = new fileinputstream(afilepath   "\\"   filename);             // 得到响应对象的输出流,用于向客户端输出二进制数据             out = response.getoutputstream();             out.flush();             int aread = 0;             byte b[] = new byte[1024];             while ((aread = in.read(b)) != -1 & in != null) {                 out.write(b, 0, aread);             }             out.flush();             in.close();             out.close();         } catch (throwable e) {             e.printstacktrace();         }         logger.info("下载成功");         return null;     }      /**      * 下载保存时中文文件名的字符编码转换方法      */     public string toutf8string(string str) {         stringbuffer sb = new stringbuffer();         int len = str.length();         for (int i = 0; i < len; i  ) {             // 取出字符中的每个字符             char c = str.charat(i);             // unicode码值为0~255时,不做处理             if (c >= 0 && c <= 255) {                 sb.append(c);             } else { // 转换 utf-8 编码                 byte b[];                 try {                     b = character.tostring(c).getbytes("utf-8");                 } catch (unsupportedencodingexception e) {                     e.printstacktrace();                     b = null;                 }                 // 转换为%hh的字符串形式                 for (int j = 0; j < b.length; j  ) {                     int k = b[j];                     if (k < 0) {                         k &= 255;                     }                     sb.append("%"   integer.tohexstring(k).touppercase());                 }             }         }         return sb.tostring();     } }

2)创建文件列表页面

下载文件示例需要一个显示被下载文件的 jsp 页面 showdownfiles.jsp,代码如下:
 <%@ page language="java" contenttype="text/html; charset=utf-8"     pageencoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>   insert title here                    
被下载的文件名

3)测试下载功能

发布 springmvcdemo11 应用到 tomcat 服务器并启动 tomcat 服务器,然后通过地址“http://localhost:8080/springmvcdemo11/showdownfiles”测试下载示例,运行结果如图 1 所示。 图 1被下载文件列表页面 单击图 1 中的超链接下载文件,需要注意的是,使用浏览器演示该案例,不能在 myeclipse 中演示下载案例。
展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图