サークルで使用しているソフトウェアで今までは,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; }