Загрузить файл в хранилище файлов Azure

Я пытаюсь загрузить файл в свою учетную запись хранилища файлов Azure.

Это мой код:

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse("myConnString");

        CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

        CloudFileShare share = fileClient.GetShareReference("myFileStorage");

        if (await share.ExistsAsync())
        {
            CloudFileDirectory rootDir = share.GetRootDirectoryReference();
            CloudFileDirectory sampleDir = rootDir.GetDirectoryReference("/folder1/folder2/");
            CloudFile file = sampleDir.GetFileReference("fileName.jpg");

            using Stream fileStream = new MemoryStream(data);

            await file.UploadFromStreamAsync(fileStream);
        }

Я получаю эту ошибку:

Указанный родительский путь не существует.

После этой строки:

CloudFile file = sampleDir.GetFileReference("fileName");

у file есть этот uri:

https://myFileStorage.file.core.windows.net/myFileStorage/folder1/folder2/fileName.jpg

т.е. как и ожидалось.

В настоящее время мое файловое хранилище пусто, файлов / папок нет. Как мне создать свои собственные папки, если они еще не существуют?


person Eutherpy    schedule 20.11.2019    source источник


Ответы (2)


Если вы используете WindowsAzure.Storage, версия 9.3.3 и создаете только один каталог (без подкаталогов), вы можете напрямую использовать метод CreateIfNotExistsAsync() для создания каталога.

Но вот одну вещь, которую вы должны запомнить: для общего доступа к файлам SDK не поддерживает создание каталога, содержащего подкаталоги, например, «folder1 / folder2» в вашем случае. Решением для этого является создание этих каталогов один за другим.

Вот пример кода для вашего случая, создайте каталог с подкаталогами:

        static async void UploadFiles()
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse("connection_string");

            CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

            CloudFileShare share = fileClient.GetShareReference("file_share");

            if (await share.ExistsAsync())
            {
                CloudFileDirectory rootDir = share.GetRootDirectoryReference();

                //define your directories like below:
                var myfolder = "folder1/folder2";

                var delimiter = new char[] { '/' };
                var nestedFolderArray = myfolder.Split(delimiter);
                for (var i = 0; i < nestedFolderArray.Length; i++)
                {
                    rootDir = rootDir.GetDirectoryReference(nestedFolderArray[i]);
                    await rootDir.CreateIfNotExistsAsync();
                    Console.WriteLine(rootDir.Name + " created...");
                }


                CloudFile file = rootDir.GetFileReference("fileName.jpg");

                byte[] data = File.ReadAllBytes(@"file_local_path");
                Stream fileStream = new MemoryStream(data);
                await file.UploadFromStreamAsync(fileStream);
            }

        }

Результат теста => каталоги созданы и файл загружен в azure:

введите описание изображения здесь

person Ivan Yang    schedule 21.11.2019

Вы можете использовать метод CloudFileDirectory.BeginCreateIfNotExists

Дополнительная информация

person HariHaran    schedule 20.11.2019