1. 首页
  2. 技术文章
  3. Java类库

通过SimpleHttpServer框架实现Java类库中的文件上传和下载功能

通过SimpleHttpServer框架实现Java类库中的文件上传和下载功能 在开发Web应用程序时,文件上传和下载是非常常见的需求。Java提供了许多类库来处理文件操作,而通过使用SimpleHttpServer框架,我们可以轻松地实现这些功能。 SimpleHttpServer是一个简单易用的Java HTTP服务器框架,它可以帮助我们创建自己的HTTP服务器,以便处理与Web浏览器之间的通信。下面我们将展示如何使用SimpleHttpServer实现文件上传和下载功能。 首先,我们需要创建一个Java类来处理HTTP请求和响应。我们可以使用SimpleHttpServer框架提供的HttpHandler类来实现这个功能。下面是一个示例: import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import java.io.*; import java.net.URLEncoder; public class FileHandler implements HttpHandler { private static final String UPLOAD_DIRECTORY = "upload"; @Override public void handle(HttpExchange exchange) throws IOException { String requestMethod = exchange.getRequestMethod(); if (requestMethod.equalsIgnoreCase("GET")) { handleDownloadRequest(exchange); } else if (requestMethod.equalsIgnoreCase("POST")) { handleUploadRequest(exchange); } } private void handleDownloadRequest(HttpExchange exchange) throws IOException { String requestedFile = exchange.getRequestURI().getPath().substring(1); File file = new File(UPLOAD_DIRECTORY + File.separator + requestedFile); if (file.exists()) { exchange.sendResponseHeaders(200, file.length()); OutputStream outputStream = exchange.getResponseBody(); FileInputStream fileInputStream = new FileInputStream(file); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fileInputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } fileInputStream.close(); outputStream.close(); } else { String response = "File not found: " + requestedFile; exchange.sendResponseHeaders(404, response.length()); OutputStream outputStream = exchange.getResponseBody(); outputStream.write(response.getBytes()); outputStream.close(); } } private void handleUploadRequest(HttpExchange exchange) throws IOException { String boundary = exchange.getRequestHeaders().getFirst("Content-Type").split("=")[1]; InputStream inputStream = exchange.getRequestBody(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String line; while ((line = bufferedReader.readLine()) != null) { if (line.contains("Content-Disposition: form-data")) { String fileName = line.substring(line.lastIndexOf("=") + 2, line.lastIndexOf("\"")); if (!fileName.isEmpty()) { File file = new File(UPLOAD_DIRECTORY + File.separator + fileName); FileOutputStream fileOutputStream = new FileOutputStream(file); while (!(line = bufferedReader.readLine()).equals("--" + boundary)) { if (!line.equals("--" + boundary + "--")) { fileOutputStream.write(line.getBytes()); fileOutputStream.write("\r ".getBytes()); } } fileOutputStream.close(); } } } String response = "File uploaded successfully"; exchange.sendResponseHeaders(200, response.length()); OutputStream outputStream = exchange.getResponseBody(); outputStream.write(response.getBytes()); outputStream.close(); } } 在上面的代码中,我们创建了一个名为FileHandler的类来处理HTTP请求。handle方法根据请求的方法类型,调用handleDownloadRequest方法来处理下载请求,或者调用handleUploadRequest方法来处理上传请求。在handleDownloadRequest方法中,我们首先检查文件是否存在,如果存在,则向响应输出流写入文件内容。如果文件不存在,则向响应输出流写入错误提示信息。在handleUploadRequest方法中,我们通过解析请求体来获取上传的文件名,并创建一个新的文件来保存上传的文件内容。 接下来,我们需要创建一个简单的HTTP服务器并将FileHandler与请求路径关联起来。使用SimpleHttpServer框架可以轻松实现这一点。下面是一个示例: import com.sun.net.httpserver.HttpServer; import java.io.IOException; import java.net.InetSocketAddress; public class Main { public static void main(String[] args) { try { HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); server.createContext("/files", new FileHandler()); server.start(); System.out.println("Server started on port 8000"); } catch (IOException e) { e.printStackTrace(); } } } 在上面的代码中,我们创建了一个HTTP服务器,并将FileHandler与路径“/files”关联起来。这意味着当客户端通过该路径发出HTTP请求时,FileHandler将来处理该请求。我们在端口8000上启动服务器,并在控制台输出相应的信息。 现在我们可以通过发送HTTP请求来进行文件上传和下载。例如,要上传文件,我们可以使用curl命令: curl --location --request POST 'http://localhost:8000/files' \ --header 'Content-Type: multipart/form-data; boundary=--------------------------1234567890' \ --form 'file=@/path/to/file.txt' 要下载文件,我们可以使用curl命令: curl --location --request GET 'http://localhost:8000/files/file.txt' --output file.txt 通过使用SimpleHttpServer框架,我们可以轻松地实现Java类库中的文件上传和下载功能。希望这篇文章对你有帮助!
Read in English