LOGCAT.IO | Android使用webdav工具类

直接上代码:

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);
            }
        }
    }
}

未添加的功能:

  1. 在上传时添加版本号文件
  2. 上传之前对比版本号文件进行复写
  3. 文件差异化