2016-02-01 1 views
1

Je suis en train de mettre en œuvre les ajax browser uploads directement dans un conteneur de stockage azure. Tout d'abord, j'ai besoin d'une URL signée qui me permettra de le faire sans partager ma clé privée avec le navigateur (je demande à mon serveur pour cette URL signée sur un appel ajax précédent). Mon code côté serveur ressemble à ceci:Comment puis-je générer une en-tête Content-Length d'une signature Azure SAS à une certaine valeur?

public string GetSignature(string fileName, int contentLength) 
{ 
    CloudBlobContainer blobContainer = this.BlobClient.GetContainerReference("demo"); 

    CloudBlockBlob blob = blobContainer.GetBlockBlobReference("photo1.jpg"); 

    SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy() 
    { 
     Permissions = SharedAccessBlobPermissions.Create, 
     SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10) 
    }; 

    SharedAccessBlobHeaders headers = new SharedAccessBlobHeaders() 
    { 
     CacheControl = "", 
     ContentDisposition = "", 
     ContentEncoding = "", 
     ContentLanguage = "", 
     ContentType = "" 
     // PROBLEM: Where's content length? 
    }; 

    return blob.GetSharedAccessSignature(policy, headers);    
} 

Mon problème est que je ne peux pas trouver un moyen de spécifier l'en-tête de longueur du contenu. J'en ai besoin pour empêcher les utilisateurs de télécharger des fichiers volumineux une fois qu'ils ont une citation de stockage qui doit être respectée. J'ai beaucoup googlé et trouvé un moyen de le faire qui implémente l'algorithme de signature selon this link, mais mettre en œuvre tout cela moi-même est juste mon dernier recours (il sera plus sujet aux erreurs et prendra du temps). Donc, ma question est, est-il un moyen de passer la contrainte de longueur de contenu à une URL signée PUT?

Répondre

2

Il n'y a actuellement aucun moyen de mettre des limitations de taille de blob sur l'accès délégué. (Le lien fourni est pour les demandes de signature avec la clé de compte, il ne limite pas la taille du blob en cours de téléchargement.)

Il y a deux facteurs qui limitent la quantité de données téléchargées dans ce scénario:

  1. Limitations temporelles du jeton SAS. Votre code affiche une fenêtre de 10 minutes; en supposant 60 Mo/sec qui permet d'environ 36 Go.
  2. La taille maximale d'un seul objet blob est une limite supérieure rigide.

Une solution consiste à balayer le conteneur périodiquement et à nettoyer les blobs qui dépassent le quota de l'utilisateur. En tant que point latéral, SharedAccessBlobHeaders contrôle ce que les utilisateurs voient lorsqu'ils téléchargent le blob. Ils ne limitent pas ce que l'utilisateur peut télécharger, ils ne sont donc pas pertinents pour votre scénario. Vous pouvez simplement passer en null pour ce paramètre.