一、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
微信掃一掃
支付寶掃一掃