一、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