好记性不如烂笔头13-使用HttpServletResponse实现文件下载


在JS中也可以实现文件下载,但是在JS中的链接,很容易被盗链,而且容易造成攻击。将文件下载的链接放在JAVA端,能够对用户的请求进行更加多的校验,能防止一部分的盗链和攻击。

1、使用HttpServletResponse实现下载功能的实现

  1.获取要下载的文件的绝对路径

  2.获取要下载的文件名

  3.设置content-disposition响应头控制浏览器以下载的形式打开文件

  4.获取要下载的文件输入流

  5.创建数据缓冲区

  6.通过response对象获取OutputStream流

  7.将FileInputStream流写入到buffer缓冲区

  8.使用OutputStream将缓冲区的数据输出到客户端浏览器

2、使用HttpServletResponse实现下载注意事项

文件下载注意事项:编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。

下载中文文件时,需要注意的地方就是中文文件名要使用URLEncoder.encode方法进行编码(URLEncoder.encode(fileName, "字符编码")),否则会出现文件名乱码。

response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));

3、HttpServletResponse实现下载的源代码

package com.servlet;

 

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

 

/**

 *通过HttpServletResponse实现简单的文件下载

 *

 *@author 范芳铭

 */

public class ResponseDownload extendsHttpServlet {

    publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

            throwsServletException, IOException {

 

        //1.获取要下载的文件的绝对路径

        StringrealPath = this.getServletContext().getRealPath("/files/fxjh.jpg");

        //2.获取要下载的文件名

        StringfileName = realPath.substring(realPath.lastIndexOf("\\") + 1);

        //3.设置content-disposition响应头控制浏览器以下载的形式打开文件

        response.setHeader("content-disposition","attachment;filename="

                +fileName);

        //4.获取要下载的文件输入流

        InputStreamin = new FileInputStream(realPath);

        intlen = 0;

        //5.创建数据缓冲区

        byte[]buffer = new byte[1024];

        //6.通过response对象获取OutputStream流

        OutputStreamout = response.getOutputStream();

        //7.将FileInputStream流写入到buffer缓冲区

        while((len = in.read(buffer)) > 0) {

            //8.使用OutputStream将缓冲区的数据输出到客户端浏览器

            out.write(buffer,0, len);

        }

        in.close();

    }

 

    publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

            throwsServletException, IOException {

        doGet(request,response);

    }

}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。