Java实现坚果云WebDAV文件夹上传(兼容多系统含安卓15)

一、软件环境:

      1.1 开发环境:

                需要OkHttp(开发商为Squre)。

      1.2 运行环境:

                兼容多种操作系统,包括Windows、Android等。需要安装Java运行环境。

二、代码实现:

       2.1 实现类:

//CWebDAVFolderUploader.java
package com.example; // 根据实际情况修改包名。
import java.io.File;
import java.io.IOException;
import java.util.Base64;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class CWebDAVFolderUploader {
    private final OkHttpClient m_OkHttpClient;
    private final String m_serverURL;
    private final String m_authHeader;

    public CWebDAVFolderUploader(String serverUrl, String username, String password) {
        this.m_OkHttpClient = new OkHttpClient();
        this.m_serverURL = serverUrl;
        this.m_authHeader = getBasicAuthHeader(username, password);

    }

    private String getBasicAuthHeader(String username, String password) {
        String auth = username + ":" + password;
        byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes());
        return "Basic " + new String(encodedAuth);
    }

    public void uploadFolder(File localFolder, String remotePath) throws IOException {
        if (localFolder.isDirectory()) {
            createRemoteDirectory(remotePath);
            File[] files = localFolder.listFiles();
            if (files != null) {
                for (File file : files) {
                    String newRemotePath = remotePath + "/" + file.getName();
                    if (file.isDirectory()) {
                        uploadFolder(file, newRemotePath);
                    } else {
                        uploadFile(file, newRemotePath);
                    }
                }
            }
        }
    }

    private void createRemoteDirectory(String remotePath) throws IOException {
        Request request = new Request.Builder()
                .url(m_serverURL + remotePath)
                .method("MKCOL", null)
                .addHeader("Authorization", m_authHeader)
                .build();
        try (Response response = m_OkHttpClient.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                System.out.println("创建远程目录失败: " + remotePath + ", 响应码: " + response.code());
            }
        }
    }

    private void uploadFile(File localFile, String remotePath) throws IOException {
        RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), localFile);
        Request request = new Request.Builder()
                .url(m_serverURL + remotePath)
                .put(body)
                .addHeader("Authorization", m_authHeader)
                .build();
        try (Response response = m_OkHttpClient.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                System.out.println("上传文件失败: " + localFile.getName() + ", 响应码: " + response.code());
            }
        }
    }
}

       2.2 Windows调用:

Build.gradle:

……
dependencies {
……
    implementation 'com.squareup.okhttp3:okhttp:4.10.0-RC1' //增加OkHttp依赖。
}
……

App.java:

//App.java:
package com.example;
import okhttp3.*;

import java.io.File;
import java.io.IOException;

public class App {
    public static void main(String[] args) {
        String serverUrl = "https://dav.jianguoyun.com/dav/";
        String username = "myemail @domain.com"; // 注意:坚果云目前要求填写账户名,而非应用名称!
        String password = "fh4hxtea2zik4cji"; // 注意:坚果云目前要求填写应用密码,而非账户密码!

        CWebDAVFolderUploader uploader = new CWebDAVFolderUploader(serverUrl, username, password);
        try {
            uploader.uploadFolder(new File("E:\\temp\\toJianguoyun"), "davUpDir"); //把e:\temp\toJianguoyun文件夹上传为坚果云上的davUpDir文件夹。
            System.out.println("文件夹上传结束");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

       2.3 Android调用:

MainActivity.Java:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //添加权限申请代码:
        int REQUEST_CODE_PRIVILLEGE = 1024; // 申请权限
        if (Environment.isExternalStorageManager()) {
            onRequestPermissionsComplete();
        } else {
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, REQUEST_CODE_PRIVILLEGE);
        }
//……
    }
    private void onRequestPermissionsComplete() {
    // 可添加权限申请成功提示,如:Toast.makeText(this,"存储权限申请成功!",Toast.LENGTH_SHORT).show();
    }
//……
    private void performUpload() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                // 本例子把文件夹上传到坚果云:
                String serverUrl = "https://dav.jianguoyun.com/dav/";
                String username = "your_email@domain.com"; // 注意:坚果云目前要求填写账户名,而非应用名称!
                String password = "fojhfica7avj4nle"; // 注意:坚果云目前要求填写应用密码,而非账户密码!

                CWebDAVFolderUploader uploader = new CWebDAVFolderUploader(serverUrl, username, password);
                try {
                    // 把本地文件夹:内部存储里的 /dirToJianguoyun 文件夹 上传为坚果云上的davUpDir_Android文件夹:
                    uploader.uploadFolder(new File("/storage/emulated/0/dirToJianguoyun"), "davUpDir_Android");
                    System.out.println("文件夹上传结束");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

Build.gradle.kts:

……
dependencies {
	……
	implementation("com.squareup.okhttp3:okhttp:4.12.0") //添加OkHttp依赖。
}
……

AndroidManifest.xml里添加所需权限描述:

……
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />

    <application ……>
		……
	</application>
	……
</manifest>

三、其它特性:

       200MB以上文件测试通过

       中文测试通过

       四级以上目录测试通过

       ……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值