Java 上传文件到多个服务器
在Java中实现文件上传到多个服务器,可以通过以下几种方法实现,我将介绍几种常见的实现方式,包括使用Apache HttpClient、Spring框架以及并行处理技术。

使用Apache HttpClient
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public class MultiServerFileUploader {
private static final List<String> SERVER_URLS = Arrays.asList(
"http://server1.com/upload",
"http://server2.com/upload",
"http://server3.com/upload"
);
public static void uploadToAllServers(File file) throws IOException {
for (String serverUrl : SERVER_URLS) {
uploadToServer(serverUrl, file);
}
}
private static void uploadToServer(String serverUrl, File file) throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost uploadFile = new HttpPost(serverUrl);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file);
uploadFile.setEntity(builder.build());
HttpResponse response = httpClient.execute(uploadFile);
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
String responseString = EntityUtils.toString(responseEntity);
System.out.println("Server " + serverUrl + " response: " + responseString);
}
}
}
public static void main(String[] args) {
File fileToUpload = new File("path/to/your/file.txt");
try {
uploadToAllServers(fileToUpload);
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用Spring框架的RestTemplate
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.io.File;
import java.util.Arrays;
import java.util.List;
public class SpringMultiServerUploader {
private static final List<String> SERVER_URLS = Arrays.asList(
"http://server1.com/upload",
"http://server2.com/upload",
"http://server3.com/upload"
);
public static void uploadToAllServers(File file) {
RestTemplate restTemplate = new RestTemplate();
for (String serverUrl : SERVER_URLS) {
uploadToServer(restTemplate, serverUrl, file);
}
}
private static void uploadToServer(RestTemplate restTemplate, String serverUrl, File file) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", new FileSystemResource(file));
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
try {
ResponseEntity<String> response = restTemplate.postForEntity(serverUrl, requestEntity, String.class);
System.out.println("Server " + serverUrl + " response: " + response.getBody());
} catch (Exception e) {
System.err.println("Error uploading to " + serverUrl + ": " + e.getMessage());
}
}
public static void main(String[] args) {
File fileToUpload = new File("path/to/your/file.txt");
uploadToAllServers(fileToUpload);
}
}
并行上传(提高效率)
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ParallelMultiServerUploader {
private static final List<String> SERVER_URLS = Arrays.asList(
"http://server1.com/upload",
"http://server2.com/upload",
"http://server3.com/upload"
);
private static final int THREAD_POOL_SIZE = 3;
public static void uploadToAllServers(File file) {
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
for (String serverUrl : SERVER_URLS) {
executorService.submit(() -> {
try {
uploadToServer(serverUrl, file);
} catch (IOException e) {
System.err.println("Error uploading to " + serverUrl + ": " + e.getMessage());
}
});
}
executorService.shutdown();
try {
executorService.awaitTermination(1, TimeUnit.HOURS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void uploadToServer(String serverUrl, File file) throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost uploadFile = new HttpPost(serverUrl);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file);
uploadFile.setEntity(builder.build());
HttpResponse response = httpClient.execute(uploadFile);
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
String responseString = EntityUtils.toString(responseEntity);
System.out.println("Server " + serverUrl + " response: " + responseString);
}
}
}
public static void main(String[] args) {
File fileToUpload = new File("path/to/your/file.txt");
uploadToAllServers(fileToUpload);
}
}
使用Spring Boot的WebClient(异步)
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.MediaType;
import org.springframework.http.client.MultipartBodyBuilder;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import java.io.File;
import java.util.Arrays;
import java.util.List;
public class ReactiveMultiServerUploader {
private static final List<String> SERVER_URLS = Arrays.asList(
"http://server1.com/upload",
"http://server2.com/upload",
"http://server3.com/upload"
);
private static final WebClient webClient = WebClient.builder().build();
public static void uploadToAllServers(File file) {
SERVER_URLS.forEach(serverUrl -> uploadToServer(serverUrl, file).subscribe());
}
private static Mono<String> uploadToServer(String serverUrl, File file) {
MultipartBodyBuilder builder = new MultipartBodyBuilder();
builder.part("file", new FileSystemResource(file));
return webClient.post()
.uri(serverUrl)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(BodyInserters.fromMultipartData(builder.build()))
.retrieve()
.bodyToMono(String.class)
.doOnSuccess(response -> System.out.println("Server " + serverUrl + " response: " + response))
.doOnError(error -> System.err.println("Error uploading to " + serverUrl + ": " + error.getMessage()));
}
public static void main(String[] args) {
File fileToUpload = new File("path/to/your/file.txt");
uploadToAllServers(fileToUpload);
// Keep the application running to see async results
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
注意事项
- 错误处理:在实际应用中,应该添加更完善的错误处理和重试机制
- 性能考虑:大文件上传时考虑分块上传和断点续传
- 安全性:确保使用HTTPS协议,添加认证和授权机制
- 资源管理:确保正确关闭HTTP客户端和流资源
- 超时设置:根据网络环境设置合理的超时时间
- 日志记录:添加详细的日志记录以便排查问题
方法可以根据你的具体需求和技术栈选择最适合的实现方式,并行上传和异步上传可以显著提高上传多个服务器的效率。

