web-dev-qa-db-fra.com

Chargement de blockblob et définition de contenttype

J'utilise la bibliothèque Microsoft.WindowsAzure.Storage.* à partir de C #.

Voici comment je télécharge des éléments sur un stockage:

// Store in storage
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("...connection string...");
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("pictures");

// Create container if it doesnt exist
container.CreateIfNotExists();

// Make available to everyone
container.SetPermissions(new BlobContainerPermissions
{
    PublicAccess = BlobContainerPublicAccessType.Blob
});

// Save image
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blah.jpg");
blockBlob.UploadFromByteArray(byteArrayThumbnail, 0, byteArrayThumbnail.Length);
blockBlob.Properties.ContentType = "image/jpg";  // *** NOT WORKING ***

Tous les éléments que je télécharge sur le stockage sont enregistrés avec le type de contenu "application/octet-stream", même si j'utilise le paramètre avec la valeur "image/jpg" (voir la dernière ligne de mon code).

Donc, question n ° 1: pourquoi ne fonctionne pas le setter ContentType?

Et question n ° 2: si je modifie manuellement le type de contenu en "image/jpg" à l'aide du portail de gestion Windows Azure, puis copie l'adresse URI absolue du fichier dans le champ d'adresse du navigateur et que j'appuie sur Entrée, le fichier jpg est téléchargé de affiché. Ce type MIME n'est-il pas censé être affiché au lieu d'être téléchargé? Comment puis-je changer cela?

11
sports

En fait, vous n'avez pas à appeler la méthode SetProperties. Pour définir le type de contenu lors du téléchargement du blob, définissez simplement la propriété ContentType avant d'appeler la méthode de téléchargement. Donc, votre code devrait être:

// Save image
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blah.jpg");
blockBlob.Properties.ContentType = "image/jpg";
blockBlob.UploadFromByteArray(byteArrayThumbnail, 0, byteArrayThumbnail.Length);

et cela devrait faire l'affaire.

69
Gaurav Mantri

Une fois que vous avez apporté des modifications à Properties, vous devez appeler CloudBlockBlob.SetProperties () pour enregistrer ces modifications.

Pensez-y comme à quelque chose de similaire à LINQ-to-Entities. Vous pouvez apporter les modifications souhaitées à votre objet local, mais tant que vous n'avez pas appelé SaveChanges(), rien n'est réellement enregistré.

20
Nathan A

avec la nouvelle version du SDK Azure Blob, cela ne fonctionne plus.

cela a fonctionné pour moi:

CloudBlockBlob blockBlob = cloudBlobContainer.GetBlockBlobReference(blobName);
blockBlob.Properties.ContentType = contentType;                            
await blockBlob.SetPropertiesAsync();
0
aumanjoa