Как получить доступ к файлам nextcloud на С# с помощью WebDav?

При попытке получить доступ к WebDav API nextcloud через WinSCP я столкнулся с несколькими проблемами с правильным использованием корневой папки, удаленного пути и т. д. Чтобы сэкономить время другим, вот рабочий код, который я придумал для загрузки файла в удаленная (общая) папка.

Уроки выучены:

  1. имя сервера предоставляется без протокола, это определяется SessionOptions.Protocol
  2. корневая папка не может быть пустой, должна быть не меньше "/"
  3. следующий облачный провайдер / конфигурация определяет корневой URL-адрес, поэтому «webdav» или «dav» после remote.php предопределены. Обычно вы можете увидеть его в левом нижнем углу при использовании веб-приложения nextcloud в разделе настроек.
  4. "files/user" или "files/username" не обязательно требуются - также определяются хостером/конфигурацией
  5. подключающийся пользователь должен иметь права доступа к данному каталогу, вы должны предоставить права доступа к файлам другим (при желании), предоставив FilePermissions в TransferOptions

Однако рабочего примера нет ни в WinSCP, ни в документации nextcloud, ни здесь найти нечего.


person CodeMonga    schedule 16.06.2019    source источник
comment
Пожалуйста, измените сообщение на вопрос и отдельный ответ, например, «как получить доступ ...» с немного большим количеством мяса. Затем опубликуйте решение как ответ. Тогда он будет соответствовать формату сайта. Также загляните в справочный центр и пройдите тур< /а>   -  person Sami Kuhmonen    schedule 16.06.2019
comment
Редактирование сделано - контекст не меняется....   -  person CodeMonga    schedule 16.06.2019


Ответы (1)


// Setup session options
var sessionOptions = new SessionOptions
{
    Protocol = Protocol.Webdav,
    HostName = server,
    WebdavRoot = "/remote.php/webdav/" 
    UserName = user,
    Password = pass,
};

using (var session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    var files = Directory.GetFiles(sourceFolder);

    logger.DebugFormat("Got {0} files for uploading to nextcloud from folder <{1}>", files.Length, sourceFolder);

    TransferOptions tOptions = new TransferOptions();
    tOptions.TransferMode = TransferMode.Binary;
    tOptions.FilePermissions = new FilePermissions() { OtherRead = true, GroupRead = true, UserRead = true };

    string fileName = string.Empty;
    TransferOperationResult result = null;

    foreach (var localFile in files)
    {
        try
        {
            fileName = Path.GetFileName(localFile);

            result = session.PutFiles(localFile, string.Format("{0}/{1}", remotePath, fileName), false, tOptions);

            if (result.IsSuccess)
            {
                result.Check();

                logger.DebugFormat("Uploaded file <{0}> to {1}", Path.GetFileName(localFile), result.Transfers[0].Destination);
            }
            else
            {
                logger.DebugFormat("Error uploadin file <{0}>: {1}", fileName, result.Failures?.FirstOrDefault().Message);
            }
        }
        catch (Exception ex)
        {
            logger.DebugFormat("Error uploading file <{0}>: {1}", Path.GetFileName(localFile), ex.Message);
        }
    }
}

Надеюсь, это сэкономит время другим.

person CodeMonga    schedule 16.06.2019