详解 Java HttpFileHandler 的使用

一、HttpFileHandler的概述

HttpFileHandler是Java提供的HTTP文件处理类,能够提供基于HTTP的文件访问、上传下载和删除等功能。当需要实现Java应用程序转换成文件服务器时,可以选择使用HttpFileHandler。

HttpFileHandler所处理的文件不依赖于何种操作系统,因此可以在多个平台上运行,并且支持多个客户端同时上传下载文件。

下面将介绍HttpFileHandler的创建和使用。

二、HttpFileHandler的创建

HttpFileHandler的创建需要通过HttpServer创建,以下是创建HttpServer的示例代码:

// 导入HttpServer类
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;

// 创建HttpServer
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);

创建HttpServer之后,可以通过该服务器创建HttpFileHandler,示例代码如下:

// 导入HttpFileHandler类
import com.sun.net.httpserver.HttpFileHandler;
import java.io.File;

// 创建HttpFileHandler
HttpFileHandler fileHandler = new HttpFileHandler(new File(".").getAbsolutePath());

以上代码将会把文件服务器的根目录指定为当前目录,可以根据需要修改。

三、HttpFileHandler的使用

1. 获取文件列表

可以通过访问HttpFileHandler的根目录获取该目录下的文件列表,示例代码如下:

// 导入HttpContext类
import com.sun.net.httpserver.HttpContext;

// 创建HttpContext并绑定HttpFileHandler
HttpContext context = server.createContext("/", fileHandler);

// 添加HttpHandler
context.setHandler(exchange -> {
    // 获取文件列表
    File[] files = fileHandler.getFileList(exchange.getRequestURI().getPath());
    // 返回文件列表
    StringBuilder response = new StringBuilder();
    for (File file : files) {
        response.append(file.getName()).append("\n");
    }
    exchange.sendResponseHeaders(200, response.length());
    exchange.getResponseBody().write(response.toString().getBytes());
    exchange.close();
});

// 启动HttpServer
server.start();

在访问http://localhost:8080/时,将返回当前目录下的文件列表。

2. 文件上传

文件上传需要使用POST方法,并且在请求头中添加Content-Type: multipart/form-data,示例代码如下:

// 添加HttpHandler
context.setHandler(exchange -> {
    if (exchange.getRequestMethod().equalsIgnoreCase("POST")) {
        Headers headers = exchange.getRequestHeaders();
        if (headers.containsKey("Content-Type") && headers.get("Content-Type").get(0).startsWith("multipart/form-data")) {
            String dir = exchange.getRequestURI().getPath();
            int index = dir.lastIndexOf("/");
            if (index >= 0) {
                dir = dir.substring(0, index + 1);
            } else {
                dir = "/";
            }

            // 上传文件
            HttpExchangeWrapper exchangeWrapper = new HttpExchangeWrapper(exchange);
            fileHandler.handle(exchangeWrapper.getRequestBody(), dir, exchangeWrapper.getRequestHeaders().getFirst("Content-Type"), exchangeWrapper.getRequestHeaders().getFirst("Content-Disposition"));
            exchange.sendResponseHeaders(200, 0);
            exchange.close();
            return;
        }
    }

    // 返回错误信息
    exchange.sendResponseHeaders(500, 0);
    exchange.close();
});

文件上传需要使用HttpExchangeWrapper包装请求体,该包装类可以将输入流转换为ByteArrayOutputStream,示例代码如下:

import com.sun.net.httpserver.HttpExchange;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

public class HttpExchangeWrapper {
    private HttpExchange exchange;
    private ByteArrayOutputStream outputStream;
    private Map<String, List> headers;

    public HttpExchangeWrapper(HttpExchange exchange) {
        this.exchange = exchange;
        this.outputStream = new ByteArrayOutputStream();
        this.headers = exchange.getRequestHeaders();
    }

    public InputStream getRequestBody() {
        return exchange.getRequestBody();
    }

    public Map<String, List> getRequestHeaders() {
        return headers;
    }

    public byte[] getRequestBodyBytes() throws IOException {
        byte[] byteArray = outputStream.toByteArray();
        if (byteArray.length = 0) {
                outputStream.write(buffer, 0, count);
            }
            byteArray = outputStream.toByteArray();
            outputStream.close();
        }
        return byteArray;
    }
}

3. 文件下载

文件下载需要通过GET方法访问文件,示例代码如下:

// 添加HttpHandler
context.setHandler(exchange -> {
    if (exchange.getRequestMethod().equalsIgnoreCase("GET")) {
        String path = exchange.getRequestURI().getPath();
        File file = new File("." + path);
        if (!file.exists() || !file.isFile()) {
            exchange.sendResponseHeaders(400, 0);
            exchange.close();
            return;
        }

        // 下载文件
        exchange.sendResponseHeaders(200, file.length());
        InputStream inputStream = new FileInputStream(file);
        OutputStream outputStream = exchange.getResponseBody();
        byte[] buffer = new byte[4096];
        int count;
        while ((count = inputStream.read(buffer)) >= 0) {
            outputStream.write(buffer, 0, count);
        }

        inputStream.close();
        outputStream.close();
        exchange.close();
        return;
    }

    // 返回错误信息
    exchange.sendResponseHeaders(500, 0);
    exchange.close();
});

4. 文件删除

文件删除需要通过DELETE方法访问文件,示例代码如下:

// 添加HttpHandler
context.setHandler(exchange -> {
    if (exchange.getRequestMethod().equalsIgnoreCase("DELETE")) {
        String path = exchange.getRequestURI().getPath();
        File file = new File("." + path);
        if (!file.exists() || !file.isFile()) {
            exchange.sendResponseHeaders(400, 0);
            exchange.close();
            return;
        }

        // 删除文件
        if (file.delete()) {
            exchange.sendResponseHeaders(200, 0);
        } else {
            exchange.sendResponseHeaders(500, 0);
        }
        exchange.close();
        return;
    }

    // 返回错误信息
    exchange.sendResponseHeaders(500, 0);
    exchange.close();
});

结语

本文详细介绍了Java HttpFileHandler的创建和使用,包括获取文件列表、文件上传下载和删除等功能。希望本文能够对读者使用HttpFileHandler有所帮助。

原创文章,作者:OHBNP,如若转载,请注明出处:https://www.506064.com/n/370651.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
OHBNPOHBNP
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相关推荐

  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论