面试题答案
一键面试实现思路
- 初始化HttpClient:创建一个
HttpClient
实例用于发起HTTP请求。 - 遍历文件列表:对需要上传的多个文件进行循环处理。
- 监听上传进度:利用
HttpClient
提供的功能,为每个文件的上传请求添加进度监听器,以实时获取上传进度。 - 处理上传失败:在上传失败时,根据重试机制进行重试操作,例如设置重试次数,每次失败后等待一定时间再重试。
关键代码片段(以Java为例,基于Apache HttpClient)
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
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;
public class FileUploader {
private static final int MAX_RETRIES = 3;
private static final int WAIT_TIME_BETWEEN_RETRIES = 1000; // 1 second
public static void main(String[] args) {
File[] files = {new File("file1.txt"), new File("file2.txt")};
for (File file : files) {
uploadFile(file);
}
}
private static void uploadFile(File file) {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://your-upload-url");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file, ContentType.APPLICATION_OCTET_STREAM, file.getName());
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
int retryCount = 0;
while (retryCount < MAX_RETRIES) {
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
if (response.getStatusLine().getStatusCode() == 200) {
System.out.println("File " + file.getName() + " uploaded successfully.");
break;
} else {
System.out.println("Upload failed for file " + file.getName() + ". Status code: " + response.getStatusLine().getStatusCode());
}
} catch (IOException e) {
System.out.println("Upload failed for file " + file.getName() + ". Error: " + e.getMessage());
}
retryCount++;
if (retryCount < MAX_RETRIES) {
try {
Thread.sleep(WAIT_TIME_BETWEEN_RETRIES);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
if (retryCount == MAX_RETRIES) {
System.out.println("Max retries reached. File " + file.getName() + " upload failed.");
}
}
}
关键代码解释
- 初始化HttpClient:
CloseableHttpClient httpClient = HttpClients.createDefault();
创建一个默认的HttpClient
实例。 - 设置HTTP请求:
HttpPost httpPost = new HttpPost("http://your-upload-url");
创建一个HttpPost
请求,并指定上传的URL。 - 构建Multipart请求体:
MultipartEntityBuilder
用于构建包含文件的Multipart请求体,builder.addBinaryBody("file", file, ContentType.APPLICATION_OCTET_STREAM, file.getName());
将文件添加到请求体中。 - 重试机制:通过
while
循环和retryCount
变量实现重试逻辑,每次失败后等待WAIT_TIME_BETWEEN_RETRIES
时间再重试。
注意:以上代码仅为示例,实际应用中需要根据具体的业务需求和环境进行调整,例如处理更复杂的错误情况、优化重试策略等。同时,不同的编程语言和HttpClient库在具体实现上会有所差异,但核心思路是相似的。