サークルで使用しているソフトウェアで今までは,GoogleDriveからいろんなファイルをダウンロード,アップロードしていましたが,WebDAVサーバからインストーラーを落としてくるようにするために修正をしていました. その時に学習した内容について書きます.
今回は,NuGet packageマネージャを使用して,GitHub - skazantsev/WebDavClient: Asynchronous cross-platform WebDAV client for .NET Coreをインストールして使用しました.
先に,アクセス先のWebDAVサーバでアプリでアクセスするためのトークンを発行しておきます. OwnCloudなら,設定>セキュリティに進み「パスワード/トークンを追加する」の項目からトークンを発行できます.
ファイルをダウンロードして,新規に保存するのであれば,次のようにするとできます.
// baseURLは,アクセスするWebDAVサーバのURL.OwnCloudなら,https://example.com/owncloud/public.php/webdav かな.
string baseAddr = baseURL + "/someDirectory/";
var clientParams = new WebDav.WebDavClientParams
{
// ダウンロードするファイルがあるディレクトリを指定
BaseAddress = new Uri(baseAddr),
// ユーザ名とトークンを指定
Credentials = new NetworkCredential(username, token)
};
_client = new WebDav.WebDavClient(clientParams);
var result = _client.GetRawFile(filename).Result;
if (!result.IsSuccessful) return false;
// ダウンロードしたファイルをdestinationで指定したファイルへ保存
using (FileStream fs = new FileStream(destination, FileMode.Create))
{
result.Stream.CopyTo(fs);
}
また,ディレクトリにあるファイルのリストを取得する場合には,次のようにします.
string baseAddr = baseURL + "/someDirectory/";
var clientParams = new WebDav.WebDavClientParams
{
BaseAddress = new Uri(baseAddr),
Credentials = new NetworkCredential(username, token)
};
_client = new WebDav.WebDavClient(clientParams);
var result = _client.Propfind(baseURL + "/someDirectory/").Result;
if (result.IsSuccessful)
{
foreach (var res in result.Resources)
{
if (!res.IsCollection)
{
var filename = Path.GetFileName(res.Uri);
}
}
}
ローカルのファイルをアップロードする場合は,次のようにします.
# test.txtを WebDAVサーバ上の/someDirecotry/dest.txtにアップロードする.
var localFile = "test.txt"
var destination = "dest.txt";
string baseAddr = baseURL + "/someDirectory/";
var clientParams = new WebDav.WebDavClientParams
{
BaseAddress = new Uri(baseAddr),
Credentials = new NetworkCredential(username, token)
};
_client = new WebDav.WebDavClient(clientParams);
using (FileStream fs = new FileStream(localFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
var result = _client.PutFile(destination, fs).Result;
return result.IsSuccessful;
}