java返回磁盘文件流实现下载功能

public static void downloadFile(HttpServletResponse response, String path) throws UnsupportedEncodingException {
     String filepath = "D:\\" + path;
     // 如果文件名不为空,则进行下载
     if (filepath != null) {
         File file = new File(filepath);
         // 如果文件存在,则进行下载
         if (file.exists()) {
             // 配置文件下载
             response.setHeader("content-type", "application/octet-stream");
             response.setContentType("application/octet-stream");
             // 下载文件能正常显示中文
             response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
             // 实现文件下载
             byte[] buffer = new byte[1024 * 1024];
             FileInputStream fis = null;
             BufferedInputStream bis = null;
             try {
                 fis = new FileInputStream(file);
                 bis = new BufferedInputStream(fis);
                 OutputStream os = response.getOutputStream();
                 int i = bis.read(buffer);
                 while (i != -1) {
                     os.write(buffer, 0, i);
                     i = bis.read(buffer);
                 }

             } catch (Exception e) {
                 System.out.println("Download  failed!");
             } finally {
                 if (bis != null) {
                     try {
                         bis.close();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                 }
                 if (fis != null) {
                     try {
                         fis.close();
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                 }
             }
         }
     }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过Socket实现服务器下载文件功能,具体步骤如下: 1. 创建ServerSocket对象,指定端口号,等待客户端连接; 2. 客户端连接后,通过Socket对象获取输入,读取客户端请求的文件名; 3. 判断服务器上是否存在该文件,如果存在则通过FileInputStream将文件读取到内存中,否则返回文件不存在的提示; 4. 通过Socket对象获取输出,将文件内容写入到输出中,发送给客户端; 5. 关闭输入输出和Socket对象。 下面是示例代码实现: ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); while (true) { Socket socket = server.accept(); System.out.println("客户端连接成功!"); // 获取输入,读取客户端请求的文件名 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String filename = br.readLine(); System.out.println("客户端请求下载文件:" + filename); // 判断服务器上是否存在该文件 File file = new File(filename); if (!file.exists()) { PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); pw.println("文件不存在!"); } else { // 通过FileInputStream将文件读取到内存中 FileInputStream fis = new FileInputStream(file); // 获取输出,将文件内容写入到输出中,发送给客户端 OutputStream os = socket.getOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { os.write(buffer, 0, len); } fis.close(); } // 关闭输入输出和Socket对象 br.close(); socket.close(); System.out.println("客户端已断开连接!"); } } } ``` 客户端代码如下: ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws Exception { Socket socket = new Socket("127.0.0.1", 8888); // 获取输出,发送文件名到服务器 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os, true); pw.println("test.txt"); // 获取输入,读取服务器返回文件内容 InputStream is = socket.getInputStream(); FileOutputStream fos = new FileOutputStream("test_downloaded.txt"); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } // 关闭输入输出和Socket对象 fos.close(); is.close(); pw.close(); os.close(); socket.close(); } } ``` 在运行服务器和客户端之前,需要先在服务器端创建一个test.txt文件,用于测试下载功能。运行服务器后,再运行客户端,客户端会连接到服务器并发送请求下载test.txt文件,服务器接收到请求后会将文件内容发送给客户端,客户端再将文件内容保存到本地磁盘上的test_downloaded.txt文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值