直接上代码:
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
// WebDAV文件夹上传工具类
public class WebDAVFolderUploader {
// 用于日志输出的标签
private static final String TAG = "WebDAVFolderUploader";
// WebDAV服务器的URL地址,需要替换为实际的地址
private static final String WEBDAV_SERVER_URL = "your_webdav_server_url";
// 登录WebDAV服务器的用户名,需要替换为实际的用户名
private static final String USERNAME = "your_username";
// 登录WebDAV服务器的密码,需要替换为实际的密码
private static final String PASSWORD = "your_password";
// 公开的方法,用于启动文件夹上传
public static void uploadFolder(String localFolderPath, String remoteFolderPath) {
// 创建一个HttpClient实例,用于发送HTTP请求
HttpClient httpClient = HttpClientBuilder.create().build();
try {
// 根据传入的本地文件夹路径创建一个File对象
File folder = new File(localFolderPath);
// 如果文件夹不存在或者不是一个目录,则输出错误日志并返回
if (!folder.exists() ||!folder.isDirectory()) {
Log.e(TAG, "The specified local path is not a valid folder.");
return;
}
// 调用递归方法开始上传文件夹
uploadFolderRecursive(folder, remoteFolderPath, httpClient);
} catch (IOException e) {
// 如果在上传过程中出现IO异常,输出错误日志
Log.e(TAG, "Error during upload: " + e.getMessage());
}
}
// 递归上传文件夹及其内容的私有方法
private static void uploadFolderRecursive(File folder, String remoteFolderPath, HttpClient httpClient) throws IOException {
// 获取文件夹下的所有文件和子文件夹
File[] files = folder.listFiles();
if (files == null) {
// 如果获取文件列表失败,输出错误日志并返回
Log.e(TAG, "Error getting files from the folder.");
return;
}
// 遍历文件夹下的每个文件和子文件夹
for (File file : files) {
if (file.isFile()) {
// 如果是文件,构建对应的远程文件路径
String remoteFilePath = remoteFolderPath + "/" + file.getName();
// 创建一个HttpPut对象,用于向WebDAV服务器上传文件
HttpPut httpPut = new HttpPut(WEBDAV_SERVER_URL + remoteFilePath);
// 创建一个MultipartEntityBuilder对象,用于构建多部分实体
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// 设置多部分实体的模式为浏览器兼容模式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
// 创建一个文件输入流,用于读取要上传的文件内容
InputStream inputStream = new FileInputStream(file);
// 将文件内容添加到多部分实体中,设置内容类型为二进制流,并指定文件名
builder.addBinaryBody("file", inputStream, org.apache.http.entity.ContentType.APPLICATION_OCTET_STREAM, file.getName());
// 构建HttpEntity对象
HttpEntity entity = builder.build();
// 将构建好的实体设置到HttpPut请求中
httpPut.setEntity(entity);
// 如果需要身份验证,可以取消下面这行的注释并根据实际情况进行设置
// httpPut.addHeader(new BasicScheme().authenticate(new UsernamePasswordCredentials(USERNAME, PASSWORD), httpPut, null));
try {
// 使用HttpClient发送HttpPut请求,并获取服务器的响应
HttpResponse response = httpClient.execute(httpPut);
// 获取响应的状态码
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode!= 200 && statusCode!= 201) {
// 如果状态码不是200或201,表示上传失败,输出错误日志
Log.e(TAG, "Upload failed for file: " + file.getName() + " with status code: " + statusCode);
} else {
// 如果状态码是200或201,表示上传成功,输出日志
Log.d(TAG, "Upload successful for file: " + file.getName());
}
} catch (IOException e) {
// 如果在上传文件过程中出现IO异常,输出错误日志
Log.e(TAG, "Error uploading file: " + file.getName() + ", " + e.getMessage());
}
} else if (file.isDirectory()) {
// 如果是子文件夹,构建对应的远程子文件夹路径
String subRemoteFolderPath = remoteFolderPath + "/" + file.getName();
// 递归调用本方法,上传子文件夹及其内容
uploadFolderRecursive(file, subRemoteFolderPath, httpClient);
}
}
}
}
未添加的功能:
- 在上传时添加版本号文件
- 上传之前对比版本号文件进行复写
- 文件差异化