Servlet 下载文件

// 文件路径 D:\ApacheServer\web_java\HelloWorld\src\com\test\TestServletDownload.java
package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

public class TestServletDownload {

    public void testfun(HttpServletResponse response){
        // 最好放在 response 所有输出之前调用,并且执行后避免再向浏览器发送其他输出流
        try{
            // 要下载的文件名
            String fileName = "00125943U-0.jpg";
            // 文件下载到客户端时文件名
            String downName = "download.jpg";
            
            // 获取项目运行根目录
            // Thread.currentThread().getContextClassLoader().getResource("") 获取项目运行实际 classes 目录 这里为 file:/D:/ApacheServer/web_java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/HelloWorld/WEB-INF/classes/
            // 参数 "../../" 为取向上两级目录,这里为 file:/D:/ApacheServer/web_java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/HelloWorld/
            // .toString().substring(6) 消除返回路径中的 file:/ 字符串,这里返回路径为 D:/ApacheServer/web_java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/HelloWorld/
            String appBase = Thread.currentThread().getContextClassLoader().getResource("../../").toString().substring(6);
            
            // 获取文件的绝对路径,这里为 D:/ApacheServer/web_java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/HelloWorld/upload/00125943U-0.jpg。File.separator 表示目录分割斜杠
            String fullFileName = appBase + "upload" + File.separator + fileName;
            
            // 获取文件 MIME 类型
            Path path = Paths.get(fullFileName);
            String mimeType = Files.probeContentType(path);
            
            // 设置文件 MIME 类型
            response.setContentType(mimeType);
            // 设置 Content-Disposition 响应报头,命名下载文件名称
            response.setHeader("Content-Disposition"," attachment;filename=" + downName);
            
            // 把文件读入到内存输入流中
            InputStream inputStream = new FileInputStream(fullFileName);
            // 创建输出流对象
            ServletOutputStream outputStream = response.getOutputStream();
            
            // 每次从输入流实际读取到的字节数
            int len = 0;
            // 定义一个字节数组,相当于缓存,数组长度为1024,即缓存大小为1024个字节
            byte[] cache = new byte[1024];
            // inputStream.read(cache)) 方法,从输入流中读取最多 cache 数组大小的字节,并将其存储在 cache 中。以整数形式返回实际读取的字节数,当文件读完时返回-1
            while((len = inputStream.read(cache)) != -1){
                // 每次把数组 cache 从 0 到 len 长度的内容输出到浏览器
                outputStream.write(cache, 0, len);
            }
            // 关闭流
            inputStream.close();
            outputStream.close();
        }catch(Exception exception) {
            // 处理 Class.forName 错误
            exception.printStackTrace();
        }
    }
}

 

转载于:https://www.cnblogs.com/dreamhome/p/11486644.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet文件上传功能可以通过使用注解@MultipartConfig将Servlet标识为支持文件上传,然后将multipart/form-data的POST请求封装成Part对象,通过Part对象对上传的文件进行操作。以下是一个文件上传的Servlet示例代码: ```java @WebServlet("/uploadServlet") @MultipartConfig // 如果是文件上传,必须要设置该注解! public class UploadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("文件上传..."); // 设置请求的编码格式 req.setCharacterEncoding("UTF-8"); // 获取普通表单项(获取参数) String uname = req.getParameter("uname"); // 表单中表单元素的name属性值 System.out.println("uname: " + uname); // 获取Part对象(Servlet将multipart/form-data的POST请求封装成Part对象) Part part = req.getPart("myfile"); // 通过Part对象得到上传的文件名 String fileName = part.getSubmittedFileName(); System.out.println("上传文件名:" + fileName); // 得到文件存放的路径 String filePath = req.getServletContext().getRealPath("/"); System.out.println("文件存放路径:" + filePath); // 上传文件到指定目录 part.write(filePath + "/" + fileName); } } ``` 而文件下载功能可以通过设置download属性来实现。以下是一个文件下载的JSP页面的示例代码: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件下载</title> </head> <body> <!-- 浏览器能够识别的资源 --> <a href="download/hello.txt">文本文件</a> <a href="download/pic.jpg">图片文件</a> <!-- 浏览器不能够识别的资源 --> <a href="download/zzz.rar">压缩文件</a> <hr> <a href="download/hello.txt" download>文本文件</a> <a href="download/pic.jpg" download="test.png">图片文件</a> <hr> <form action="downloadServlet"> 文件名:<input type="text" name="fileName" placeholder="请输入要下载文件名"> <button>下载</button> </form> </body> </html> ``` 以上是文件上传和下载的实现方法,你可以根据需要进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值