服务器端实现文件下载功能代码

package com.cn;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Download
 */
@WebServlet("/Download")
public class Download extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Download() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        String name = "aaa.*";// 文件名
        String uploadPath = UploadFileHelper.getRepositoryPath() + "//";// 文件来源

        String filePath = name;
        String fileName = name;
          //处理文件名包含中文,浏览器乱码
        if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
            fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// firefox浏览器
        } else {
            if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
                fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
            }
        }
        response.setContentType("text/plain");
        response.setHeader("Location", fileName);
        response.reset();
        response.setHeader("Cache-Control", "max-age=0");
        response.setHeader("Content-Disposition", "attachment; filename="
                + fileName);
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        OutputStream fos = null;
        InputStream fis = null;
        filePath = uploadPath + filePath;
        fis = new FileInputStream(filePath);
        bis = new BufferedInputStream(fis);
        fos = response.getOutputStream();
        bos = new BufferedOutputStream(fos);

        int bytesRead = 0;
        byte[] buffer = new byte[5 * 1024];
        while ((bytesRead = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, bytesRead);// 将文件发送到客户端
        }
        bos.close();
        bis.close();
        fos.close();
        fis.close();

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1694479

  • 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、付费专栏及课程。

余额充值