文件下载的实现

    科技2024-01-30  100

    文章目录

    什么是文件下载文件下载——超链接文件下载——手动编码中文文件下载给定目录下的文件下载

    什么是文件下载

    将服务器上的一个文件,通过流写入到客户端。

    文件下载的方式:

    使用超链接的方式实现文件下载通过手动编写代码的方式实现文件下载设置两个头和一个流 Content-Type:文件的MIME类型Content-Disposition:浏览器支持该格式的文件,提示下载设置代表该文件的输入流(输出流是固定的response.getOutputStream)

    文件下载——超链接

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>文件下载:超链接</h1> <h3><a href="${ pageContext.request.contextPath }/download/qwe.txt">qwe.txt</a></h3> <h3><a href="${ pageContext.request.contextPath }/download/qweqweqwe.pptx">qwe.pptx</a></h3> </body> </html>

    文件下载——手动编码

    文件下载页面准备 <h1>文件下载:手动编码</h1> <h3><a href="${ pageContext.request.contextPath }/DownloadServlet?filename = qwe.txt">qwe.txt</a></h3> <h3><a href="${ pageContext.request.contextPath }/DownloadServlet?filename = qweqweqwe.pptx">qwe.pptx</a></h3> 文件下载的Servlet /** * 文件下载的Servlet */ public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收参数 String filename = request.getParameter("filename"); //下载,设置两个头一个流 //1、设置Content-Type String type = getServletContext().getMimeType(filename); response.setContentType(type); //2、设置Content-Disposition response.setHeader("Content-Disposition", "attachment;filename="+filename); //3、设置一个代表了文件的输入流 String path = getServletContext().getRealPath("/download"); InputStream is = new FileInputStream(path+"/"+filename); OutputStream os = response.getOutputStream(); //4、两个流对接 int len =0; byte[] b = new byte[1024]; while((len = is.read(b)) != -1) { os.write(b,0,len); } is.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

    中文文件下载

    不同浏览器对中文文件下载的编码不一样。

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收参数 String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8"); //下载,设置两个头一个流 //1、设置Content-Type String type = getServletContext().getMimeType(filename); response.setContentType(type); //2、设置Content-Disposition response.setHeader("Content-Disposition", "attachment;filename="+filename); //定义一个代表该文件的路径: String path = getServletContext().getRealPath("/download"); File file = new File(path+"/"+filename); //判断浏览器类型 String agent = request.getHeader("User-Agent"); if(agent.contains("Firefox")) { //filename = base64的解码方式 }else { //ie或其他浏览器 filename = URLEncoder.encode(filename,"UTF-8"); } //3、设置一个代表了文件的输入流 InputStream is = new FileInputStream(file); OutputStream os = response.getOutputStream(); //4、两个流对接 int len =0; byte[] b = new byte[1024]; while((len = is.read(b)) != -1) { os.write(b,0,len); } is.close(); }

    给定目录下的文件下载

    需求描述: 给定一个目录,将这个路径中的文件显示到页面上,在页面上给每个文件都提供响应下载的链接,点击链接下载。

    文件列表显示(树形遍历)(downlist.jsp):

    <%@page import="java.io.File"%> <%@page import="java.util.LinkedList"%> <%@page import="java.util.Queue"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>树形遍历</h1> <% //1、创建一个队列 Queue<File> queue = new LinkedList<File>(); //2、先将根节点入队 File root = new File("D://CloudMusic"); queue.offer(root); //判断这个队列是否为空,不为空需要进行遍历: while(!queue.isEmpty()){ //将根节点出队 File file = queue.poll(); //获得根节点下的子节点 File[] files = file.listFiles(); //遍历子节点 for(File f:files){ //判断该节点是否为叶子节点 if(f.isFile()){ %> <h4><a href="${ pageContext.request.contextPath }/DownloadListServlet?filename = <%f.getCanonicalPath();%>"><%= f.getName() %></a></h4> <% }else{ queue.offer(f); } } } %> </body> </html>

    文件下载(DownloadListServlet):

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收参数 String path = request.getParameter("filename"); if(path != null) { path = new String(path.getBytes("ISO-8859-1"),"UTF-8"); } File file = new File(path); //实现文件下载 //设置两个头一个流 //获得文件名 String filename = file.getName(); response.setContentType(getServletContext().getMimeType(filename)); //设置另一个头 String agent = request.getHeader("User-Agent"); if(agent.contains("Firefox")) { //base64转码 }else { filename = URLEncoder.encode(filename,"UTF-8"); //url编码会将空格变成+ filename = filename.replace("+", " "); } response.setHeader("Content-Disposition", "attachment;filename="+filename); //设置输入流 InputStream is = new FileInputStream(file); OutputStream os = response.getOutputStream(); //流对接 int len = 0; byte[] b = new byte[1024]; while((len = is.read(b)) != -1) { os.write(b,0,len); } is.close(); }
    Processed: 0.012, SQL: 8