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