一、软件环境:
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以上文件测试通过
中文测试通过
四级以上目录测试通过
……