通过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