Как получить доступ к файлам nextcloud в C # с помощью WebDav? - PullRequest
0 голосов
/ 16 июня 2019

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

Извлеченные уроки:

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

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

1 Ответ

1 голос
/ 16 июня 2019
// 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);
        }
    }
}

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

...