ServerSocket
类来监听客户端的连接请求,并使用Socket
类来处理文件的传输。以下是一个简单的示例:,,``java,,import java.io.*;,import java.net.*;,,public class FileServer {, public static void main(String[] args) throws IOException {, int port = 8080; // 设置端口号, ServerSocket serverSocket = new ServerSocket(port);, System.out.println("文件服务器已启动,监听端口:" + port);,, while (true) {, Socket clientSocket = serverSocket.accept();, System.out.println("客户端已连接:" + clientSocket.getInetAddress());,, // 接收客户端发送的文件名, DataInputStream dis = new DataInputStream(clientSocket.getInputStream());, String fileName = dis.readUTF();,, // 读取客户端发送的文件内容, FileOutputStream fos = new FileOutputStream(fileName);, byte[] buffer = new byte[1024];, int len;, while ((len = dis.read(buffer)) != -1) {, fos.write(buffer, 0, len);, }, fos.close();, dis.close();, clientSocket.close();, System.out.println("文件 " + fileName + " 接收成功");, }, },},,
``,,这个示例仅用于演示目的,实际应用中需要考虑更多的异常处理、安全性和性能优化等方面。搭建一个Java文件服务器是一个相对复杂的任务,但通过分步骤进行,我们可以更轻松地完成,以下是详细的步骤和说明:
环境准备
在开始之前,请确保您的开发环境已经配置好Java开发工具包(JDK)以及您选择的集成开发环境(IDE),如IntelliJ IDEA或Eclipse。
项目初始化
1、创建新项目:在您的IDE中创建一个新的Java项目。
2、添加依赖:如果使用Maven作为构建工具,需要在pom.xml
文件中添加必要的依赖,可以使用Spring Boot来简化开发过程。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
编写文件服务器逻辑
1、创建控制器类:创建一个控制器类来处理文件上传和下载请求。
import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; @Controller public class FileController { private final Path fileStorageLocation = Paths.get("files-storage").toAbsolutePath().normalize(); @PostMapping("/upload") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) { try { if (!Files.exists(fileStorageLocation)) { Files.createDirectories(fileStorageLocation); } Path targetLocation = fileStorageLocation.resolve(file.getOriginalFilename()); Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING); return ResponseEntity.status(HttpStatus.OK).body("File uploaded successfully: " + file.getOriginalFilename()); } catch (Exception ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not store file: " + file.getOriginalFilename()); } } @GetMapping("/download/{filename}") public ResponseEntity<Resource> downloadFile(@PathVariable String filename) { try { Path filePath = fileStorageLocation.resolve(filename).normalize(); Resource resource = new UrlResource(filePath.toUri()); if (resource.exists()) { return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") .body(resource); } else { return ResponseEntity.notFound().build(); } } catch (Exception e) { return ResponseEntity.badRequest().body(null); } } }
2、配置文件存储路径:在application.properties
或application.yml
文件中配置文件存储路径。
file.storage=/path/to/your/storage
启动服务器
1、运行主类:创建一个包含main
方法的主类,并使用SpringApplication.run
方法启动应用程序。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class FileServerApplication { public static void main(String[] args) { SpringApplication.run(FileServerApplication.class, args); } }
2、启动应用:运行主类的main
方法,启动文件服务器,默认情况下,它将监听端口8080。
测试文件服务器
1、上传文件:使用Postman或curl工具向/upload
端点发送POST请求,包含要上传的文件。
2、下载文件:访问/download/{filename}
端点,替换{filename}
为实际文件名以下载文件。
相关问题与解答
Q1: 如何限制上传文件的大小?
A1: 可以在Spring Boot的配置文件中设置最大文件大小限制,在application.properties
中添加以下配置:
spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
Q2: 如何支持断点续传功能?
A2: 断点续传需要客户端和服务器端的协同工作,在服务器端,您可以实现Range HTTP请求头的处理,只返回请求范围内的文件内容,在客户端,需要能够发送带有Range头的HTTP请求,并在接收到部分内容后继续请求剩余的部分,这通常涉及到较为复杂的逻辑,可能需要借助第三方库来实现。
各位小伙伴们,我刚刚为大家分享了有关“java 搭建文件服务器”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!