使用 Sardine 實現webDav文件操作
基於 Sardine 實現對 WebDav 服務的文件上傳、下載、刪除、重命名、移動等操作
依賴包
<dependency>
<groupId>com.github.lookfirst</groupId>
<artifactId>sardine</artifactId>
<version>5.9</version>
</dependency>
使用類
import com.github.sardine.Sardine;
import com.github.sardine.SardineFactory;
操作例子
上傳文件
/**
* 上傳文件 <br/>
* 當對應路徑對應文件名已經存在,再次上傳會覆蓋掉原來的文件
* @param filePath 文件的相對路徑或者絕對路徑均可
* @param inputStream 輸入流
* @return 保存後的絕對路徑
* @throws IOException io異常
*/
public static String upload(String filePath, InputStream inputStream) throws IOException {
// 如果路徑中沒有加上webDav的url,則添加上去,返回絕對路徑
filePath = CommonUtil.getAbsolutePath(config.getBaseUrl(), filePath);
// 根據用戶名、密碼初始化Sardine對象
Sardine sardine = SardineFactory.begin(config.getUserName(), config.getPassword());
// 判斷目錄是否存在
String dirPath = filePath.substring(0, filePath.lastIndexOf("/"));
if (!exist(dirPath, sardine)) {
mkdir(dirPath, sardine);
}
// 執行文件上傳操作
sardine.put(filePath, inputStream);
return filePath;
}
下載文件
/**
* 下載文件 <br/>
* 輸出流輸出
* @param filePath 文件路徑
* @param outputStream 輸入流
* @throws IOException io 異常
*/
public static void download2Stream(String filePath, OutputStream outputStream) throws IOException {
// 獲取絕對路徑
filePath = CommonUtil.getAbsolutePath(config.getBaseUrl(), filePath);
// 初始化對象
Sardine sardine = SardineFactory.begin(config.getUserName(), config.getPassword());
if (exist(filePath, sardine)) {
// get操作,讀取文件
InputStream inputStream = sardine.get(filePath);
StreamUtil.transStream(inputStream, outputStream);
sardine.shutdown();
return;
}
logger.info("地址:{},文件不存在!", filePath);
}
刪除文件
/**
* 刪除文件或者目錄 <br/>
* 刪除目錄必須以 / 結尾,會將指定目錄的子目錄以及文件全部刪除
* @param filePath 文件路徑
* @throws IOException 文件不存在報異常,404
*/
public static void delete(String filePath) throws IOException {
filePath = CommonUtil.getAbsolutePath(config.getBaseUrl(), filePath);
// 初始化對象
Sardine sardine = SardineFactory.begin(config.getUserName(), config.getPassword());
// 根據指定路徑(url)執行刪除操作
sardine.delete(filePath);
sardine.shutdown();
}
更改文件名稱/移動文件路徑
/**
* 更改文件/目錄名稱 <br/>
* 移動文件/目錄
* e.g.:
* 1. 修改目錄名稱(20200619 改成 20200621)
* http://ip:port/webdav/sardline/20200619/ > http://ip:port/webdav/sardline/20200621/
* 2. 修改文件名稱(9586.jpg 改成 3562.jpg)
* http://ip:port/webdav/sardline/20200619/9586.jpg > http://ip:port/webdav/sardline/20200619/3562.jpg
* 3. 移動文件夾 (將20200619目錄移動到 date 下。注意必須以原來目錄結尾,不然會將目錄下的文件直接移動過去,20200619被刪除)
* http://ip:port/webdav/sardline/20200619/ > http://ip:port/webdav/sardline/date/20200619/
* 4. 移動文件 (最後文件名如果指定不一樣,會在移動後直接重命名)
* http://ip:port/webdav/sardline/20200619/9980.jpg > http://ip:port/webdav/sardline/20200621/9980.jpg
*
* @param source 源目錄/文件名
* @param dest 目標目錄、文件
* @throws IOException io異常
*/
public static void move(String source, String dest) throws IOException {
Sardine sardine = SardineFactory.begin(config.getUserName(), config.getPassword());
if (exist(source, sardine)) {
// 源文件存在
String destDir = dest.substring(0, dest.lastIndexOf(Constants.SLASH));
if (!exist(destDir, sardine)) {
// 目標不存在,則創建
mkdir(destDir, sardine);
}
// 執行重命名/移動操作
sardine.move(source, dest);
sardine.shutdown();
} else {
logger.info("源文件:{} 不存在", source);
}
}
創建目錄
/**
* 創建目錄,可遞歸創建
* @param filePath 待創建目錄
* @throws IOException 拋出異常
*/
public static void mkdir(String filePath, Sardine sardine) throws IOException {
String dirPath = filePath.replace(config.getBaseUrl(), "");
if (StringUtils.isNotBlank(dirPath)) {
String[] dirs = dirPath.split("/");
String path = config.getBaseUrl();
for (String dir : dirs) {
if (StringUtils.isBlank(dir)) {
continue;
}
path += dir + "/";
if (!exist(path, sardine)) {
// 執行創建目錄操作
sardine.createDirectory(path);
}
}
}
}
判斷文件是否存在
/**
* 判斷絕對路徑(目錄或者文件均可)是否已經存在
* @param filePath 絕對路徑
* @return true: 已存在,false:不存在
* @throws IOException io異常
*/
public static Boolean exist(String filePath, Sardine sardine) throws IOException {
return sardine.exists(filePath);
}