Función de descarga de archivos JAVAWeb

Dirección de blog personal https://nfreak-man.cn

  1. Escriba la página html, edite el atributo href del hipervínculo, señale el Servlet y pase el nombre y el formato del archivo que se descargará

  2. Servlet: * Obtener el nombre del archivo

    * Use el flujo de entrada de bytes para cargar archivos en la memoria

    * Especifique el encabezado de la respuesta: content-disposition: attachmement; filename = xxx

    * Escribir datos en la secuencia de salida de respuesta

html un formato de etiqueta

href = "/ day15 / downloadServlet? filename = 鬼 刀 .png"

Servlet

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求参数,文件名称
        String filename = request.getParameter("filename");
        //使用字节输入流加载文件进内存
        //找到文件的服务器路径
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/" + filename);
        //用字节流关联
        FileInputStream fis = new FileInputStream(realPath);

        //设置response的响应头
        //设置响应头类型:content-type
        String mimeType = servletContext.getMimeType(filename);
        response.setHeader("content-type",mimeType);
        //设置响应头打开方式:content-disposition
        //解决中文文件名问题
        //获取user-agent请求头
        String agent = request.getHeader("user-agent");
        //使用工具类方法编码文件名即可
        String fileName = DownLoadUtils.getFileName(agent, filename);
        response.setHeader("content-disposition","attachment;filename="+fileName);

        //将输入流的数据写出到输出流中
        ServletOutputStream sos = response.getOutputStream();
        byte[] buff = new byte[1024 * 8];
        int len = 0;
        while ((len = fis.read(buff))!=-1){
            sos.write(buff,0,len);
        }
        fis.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

Nota: para resolver el problema de que la descarga del nombre de archivo chino no se puede mostrar normalmente, debe usar la clase DownLoadUtils para obtener el método de codificación del navegador. Baidu busca la descarga.

Publicado 28 artículos originales · elogiado 0 · visitas 722

Supongo que te gusta

Origin blog.csdn.net/William_GJIN/article/details/104867310
Recomendado
Clasificación