2
votes

L'URI pour CloudBlockBlob donne des caractères spéciaux en c #

J'ai un code simple qui interagit avec Azure Blob comme ci-dessous.
Je souhaite obtenir l'URL où je télécharge le fichier.
Supposons que si dans mon stockage d'objets blob, j'ai un conteneur, dans lequel il y a plusieurs dossiers, j'ai besoin d'obtenir le chemin du fichier.Ainsi, pour obtenir cela, j'essaie d'utiliser le paramètre blockBlob.Uri.

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {         
            string   storageAccConnString = "Connection string";
            CloudStorageAccount storageAccount = "Account Name";
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            string folderPath    "Folder1" + Path.DirectorySeparatorChar + "Folder2" + Path.DirectorySeparatorChar + "Folder3";
            CloudBlobContainer container = blobClient.GetContainerReference(folderPath);
            CloudBlockBlob blockBlob = container.GetBlockBlobReference("Local system filePath which needs to be uploaded to Blob");
            Console.WriteLine("URI : " + blockBlob.Uri);
            Console.WriteLine("URI : " + blockBlob.Uri.ToString());
            Console.WriteLine("URI : " + blockBlob.Uri.OriginalString);
            Console.ReadLine();  
            // I didnt write the upload code as my question was regarding URI
        }
    }
}

J'obtiens la réponse pour cela, mais au lieu de séparateurs de dossiers comme " / " ou " \ ", j'obtiens % 5C .

URI: https://storageaccountname.blob.core.windows.net/ Dossier1% 5CFolder2% 5Folder3 / Test.zip

Comment puis-je rectifier ce problème. Toute aide serait utile. Merci.


3 commentaires

C'est ainsi que les URI incorporent des caractères spéciaux. Ils devraient être décodés très bien à l'extrémité.


@SteveTodd, je peux télécharger le fichier. Je n'ai aucun problème à ce sujet. Je dois également imprimer l'URI à des fins de journalisation. Et je ne parviens pas à obtenir le bon URI avec des caractères spéciaux. Je ne veux pas utiliser la méthode String.Replace également.


@CrazyCoder ces sont les caractères URL corrects. Dans tous les cas, il n'y a aucun dossier dans aucun fournisseur de stockage cloud - pas AWS, Google ou Azure. Tous sont des conteneurs plats avec des objets blob dont le nom est la chaîne qui vient après l'URL du conteneur. Les objets blob sont émulés dans AWS et Azure en traitant certains caractères comme des séparateurs de dossiers


5 Réponses :


0
votes

En regardant votre code, il semble que vous utilisez System.IO.Path.DirectorySeparatorChar qui (selon le Microsoft docs ) sera:

Fournissez un caractère spécifique à la plate-forme utilisé pour séparer les niveaux de répertoire dans une chaîne de chemin qui reflète une organisation hiérarchique du système de fichiers.

Lorsqu'il est exécuté sur un système Windows, DirectorySeparatorChar est \ tandis que sur un système Linux, il est / . p>

Lors de la demande aux services Web, le séparateur de chemin utilisé pour les URI est / tandis que \ est considéré comme un caractère dangereux et nécessite un encodage - d'où le % 5C que vous voyez.

Pour résoudre le problème auquel vous êtes confronté, la solution la plus simple serait de simplement remplacer votre utilisation de Path.DirectorySeparatorChar par "/" .

string folderPath = "Folder1/Folder2/Folder3";


0 commentaires

1
votes

Il y a quelques problèmes avec votre code:

  • Premièrement, le stockage d'objets blob a une hiérarchie à 2 niveaux: conteneur et objet blob. La façon dont vous créez une référence pour le conteneur est incorrecte. Étant donné que le nom de votre conteneur contient un caractère réservé URL ( \ ), l'URL est encodée sous la forme % 5C .
  • Ensuite, si vous souhaitez télécharger un fichier dans un dossier virtuel à l'intérieur d'un conteneur, vous devrez ajouter le chemin du dossier virtuel au nom de l'objet blob. Par exemple, disons que vous avez un conteneur d'objets blob appelé files et que vous souhaitez télécharger un fichier appelé myfile.txt mais placez-le dans Folder1 / Folder2 / Folder3 dossier virtuel, voici comment procéder:
static void Main(string[] args)
{         
    string   storageAccConnString = "Connection string";
    CloudStorageAccount storageAccount = "Account Name";
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();       
    CloudBlobContainer container = blobClient.GetContainerReference('files');
    var blobName = "Folder1/Folder2/Folder3" + "myfile.txt";
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
    Console.WriteLine("URI : " + blockBlob.Uri);
    Console.WriteLine("URI : " + blockBlob.Uri.ToString());
    Console.WriteLine("URI : " + blockBlob.Uri.OriginalString);
    Console.ReadLine();  
    // I didnt write the upload code as my question was regarding URI
}


0 commentaires

0
votes

Le problème est que vous demandez une référence de conteneur avec des séparateurs de répertoire. Un conteneur est uniquement destiné à être utilisé pour regrouper des objets blob au niveau racine.

Un conteneur organise un ensemble d'objets blob, similaire à un répertoire dans un système de fichiers. Un compte de stockage peut inclure un nombre illimité de conteneurs, et un conteneur peut stocker un nombre illimité d'objets blob.

Source: Introduction au stockage Azure Blob

Les objets blob peuvent contenir des séparateurs de répertoire, les organisant dans des dossiers virtuels à l'intérieur d'un conteneur .

Pour plus d'informations sur la façon de procéder, consultez Créer une hiérarchie d'objets blob Azure


0 commentaires

1
votes

Le stockage Blob n'utilise pas vraiment de dossiers et de sous-dossiers. Il utilise simplement le chemin du fichier comme nom complet du fichier. Tout ce que vous avez, c'est votre conteneur comme mécanisme de séparation. Vous pouvez télécharger des fichiers avec des séparateurs de dossiers, mais cela ne fera pas grand chose, même si les navigateurs de fichiers prenant en charge le stockage d'objets blob émuleront généralement les dossiers. Vous pouvez émuler l'emplacement d'un fichier simplement en incluant le chemin du fichier dans le nom de fichier. Vous souhaitez déplacer un fichier vers un autre répertoire? Renommez simplement le chemin du fichier, etc.

Si vous le souhaitez, vous pouvez décoder l'URL de la manière suivante:

    string input = "https://storageaccountname.blob.core.windows.net/Folder1%5CFolder2%5Folder3/Test.zip";
    string decoded = HttpUtility.UrlDecode(input);
    Console.WriteLine(decoded);


0 commentaires

0
votes

Assurez-vous que lorsque vous enregistrez un fichier comme celui-ci:

private static string changePathCharacters(string path)
        {

            return path.Replace(@"\", @"/");
        }

physicalRoute n'a pas \\ pour le séparateur de dossier, il doit avoir / séparateur:

Stream str
...
CloudBlockBlob blob = container.GetBlockBlobReference(changePathCharacters(physicalRoute) + fileName);                        

blob.UploadFromStream(str);

Ensuite, dans blockBlob.Uri.AbsoluteUri , vous aurez quelque chose comme ceci:

https://storageaccountname.blob.core.windows.net/Folder1/Folder/Folder3/Test.zip


0 commentaires