一、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
微信扫一扫
支付宝扫一扫