Javaweb| 文件下载

2020-06-29 14:54:57 浏览数 (1)

Javaweb|文件下载

学习web的同学,都知道掌握文件的上传与下载是非常重要的一步。也都习惯了先学习如何上传文件,再进一步了解如何下载文件。

但今天我们反其道而行之,就先来看看如何在网页中实现下载文件。点击下载按钮,就可以把对应资源下载下来。

该方法未进行安全防护与验证,限于新手入门学习掌握。文件的上传尝试过很多种,原生的,基于框架的,自己封装的,后面一一分享。今天就先来看看如何实现下载,在我看来,下载是比较简单的。

首先:你要知道你的文件保存在服务器的位置。(这个地方的路径也是以后上传文件需要注意的地方)没有云服务器没事,你要知道你的tomcat运行起来,项目发布在了哪儿?

默认在你的eclipse安装目录下,

.metadata.pluginsorg.eclipse.wst.server.coretmp0(或者是tmp1)wtpwebapps你的项目。可自己修改;

点开servers后 修改:

前台:通过超链接下载

代码语言:javascript复制
<a href="${pageContext.request.contextPath}/items/download.action?fileurl=0-material.zip">
下载
</a>

fileurl的值是要下载的文件的名字,有了数据库,可以设置成可变的。

后台:Conteoller

代码语言:javascript复制
/**

 * 下载文件

 * @param fileurl

 * @param session

 * @param response

 * @throws IOException

 */

@RequestMapping("/download")

public void getFile(String fileurl,  HttpSession session, HttpServletResponse response)throws IOException {

    String basePath = session.getServletContext().getRealPath("/"); // 获取基本路径

    if (null!=fileurl && !fileurl.equals("")) {

      /* 第一步:根据文件路径获取文件 */

      File file = new File(basePath   "\images\"  fileurl);

      if (file.exists()) { // 文件存在

        /* 第二步:根据已存在的文件,创建文件输入流 */

        InputStream inputStream = new BufferedInputStream(new FileInputStream(file));

        /* 第三步:创建缓冲区,大小为流的最大字符数 */

        byte[] buffer = new byte[inputStream.available()]; // int available() 返回值为流中尚未读取的字节的数量

        /* 第四步:从文件输入流读字节流到缓冲区 */

        inputStream.read(buffer);

        /* 第五步: 关闭输入流 */

        inputStream.close();

        String fileName = file.getName();// 获取文件名

        response.reset();

        response.addHeader("Content-Disposition","attachment;filename="   new String(fileName.getBytes("utf-8"), "iso8859-1"));

        response.addHeader("Content-Length", ""   file.length());

        /* 第六步:创建文件输出流 */

        OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());

        response.setContentType("application/octet-stream");

        /* 第七步:把缓冲区的内容写入文件输出流 */

        outputStream.write(buffer);

        /* 第八步:刷空输出流,并输出所有被缓存的字节 */

        outputStream.flush();

        /* 第九步:关闭输出流 */

        outputStream.close();

            }else{

              return;

            }

      }

}

使用文件流的方式将文件下载到本地。

第一步中:

basePath "\images\" fileurl 就是完整的tomat服务器下的文件的路径与名字

需要下载的0-material在这个路径下。

此时,启动项目,在页面上,点击下载,即可下载到本地。

0 人点赞