詳解 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/zh-tw/n/370651.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
OHBNP的頭像OHBNP
上一篇 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

發表回復

登錄後才能評論