【问题标题】:Java - Sending file over HTTP ServerJava - 通过 HTTP 服务器发送文件
【发布时间】:2026-02-14 08:35:02
【问题描述】:

我使用 com.sun.net.httpserver 库制作了一个 HTML 服务器。我想给客户端发送一个jar文件让他们下载。

下面这个方法实际上是让客户端下载文件:

@Override
public void handle(HttpExchange httpExchange) {
    File file = new File("Test.jar");
    try {
        httpExchange.sendResponseHeaders(200, file.length());
        OutputStream outputStream = httpExchange.getResponseBody();
        Files.copy(file.toPath(), outputStream);
        outputStream.close();
    } catch (IOException exception) {
        exception.printStackTrace();
    }
}

但它会以 zip 格式发送 jar 文件。我如何让它以 jar 文件的形式发送呢?有没有更好的文件发送方式?

【问题讨论】:

  • 如果只是提供文件下载,为什么不设置一个 sftp 服务器呢?出于纯粹的开发目的,您还可以使用 python3 -m http.server 在文件位置(假设网络是安全的/内部的)简单地通过 python webserver 启动 http
  • 这不仅仅是提供文件,服务器也会响应 JSON 数据(显然是通过其他一些上下文)。

标签: java rest https httpserver


【解决方案1】:

请尝试添加以下内容以获得正确的下载文件名:

httpExchange.getResponseHeaders().add("Content-Disposition", "attachment; filename=Test.jar");

您可能还想添加以下内容以获取正确的content-type

httpExchange.setAttribute(HTTPExchange.HeaderFields.Content_Type.toString(), "application/java-archive");

请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types 了解不同后缀的内容类型列表。

【讨论】:

  • 添加 Content-Disposition 修复了它,谢谢。但只是好奇,第二部分是做什么的?无需添加即可使用
  • @EyüpYıldız 感谢您的提问!我已经更新了我的答案。最后一个是获取正确的内容类型。