2016-04-18 17 views
2

Ich versuche, einen Blob von einem Ort zu einem anderen zu kopieren, und diese Methode scheint veraltet zu sein. Alles, was ich gelesen habe, sagt, ich sollte "StartCopy" verwenden. Wenn ich dies jedoch versuche, kopiert es den Blob nicht. Ich bekomme nur einen 404 Fehler am Ziel.Azure-Speicher-API "StartCopyFromBlob"

Ich kann anscheinend keine Dokumentation dafür finden. Kann mir jemand empfehlen, wie dies in der neuesten Version der API zu tun ist oder weisen Sie mich in Richtung einiger Dokumente.

Uri uploadUri = new Uri(destinationLocator.Path); 
string assetContainerName = uploadUri.Segments[1]; 
CloudBlobContainer assetContainer = 
    cloudBlobClient.GetContainerReference(assetContainerName); 
string fileName = HttpUtility.UrlDecode(Path.GetFileName(model.BlockBlob.Uri.AbsoluteUri)); 

var sourceCloudBlob = mediaBlobContainer.GetBlockBlobReference(fileName); 
sourceCloudBlob.FetchAttributes(); 

if (sourceCloudBlob.Properties.Length > 0) 
{ 
    IAssetFile assetFile = asset.AssetFiles.Create(fileName); 
    var destinationBlob = assetContainer.GetBlockBlobReference(fileName); 

    destinationBlob.DeleteIfExists(); 
    destinationBlob.StartCopyFromBlob(sourceCloudBlob); 
    destinationBlob.FetchAttributes(); 
    if (sourceCloudBlob.Properties.Length != destinationBlob.Properties.Length) 
     model.UploadStatusMessage += "Failed to copy as Media Asset!"; 
} 
+1

Ist der Container ein öffentlicher oder privater Container? Wenn es privat ist, müssen Sie es möglicherweise in public ändern. Oder wenn Sie den Container privat halten möchten, können Sie einen SAS für diesen Blob erstellen und SAS als Quelle verwenden. Mögliches Duplikat zu diesem Thread http://stackoverflow.com/questions/17081415/how-to-use-startcopyfromblob-between-different-accounts – forester123

+0

Es war nicht die Zugriffsebene des Containers. Es hat auch nichts mit StartCopy zu tun. Es stellte sich heraus, dass es diese Codezeilen waren. 'var mediaBlobContainer = cloudBlobClient.GetContainerReference (cloudBlobClient.BaseUri + "temporarymedia");" '' mediaBlobContainer.CreateIfNotExists(); ' Offenbar sollte ich nicht die cloudBlobClient.BaseUri beliefern, nur der Name„temporarymedia ". 'var mediaBlobContainer = cloudBlobClient.GetContainerReference (" temporarymedia ");' Es gab jedoch keine relevante Fehlermeldung. Hoffentlich wird es in Zukunft einen weiteren Azure-Neuling retten. – MountainBiker

+0

Anstatt Ihre Lösung als [comment] (// stackoverflow.com/help/privileges/comment) zu veröffentlichen, senden Sie bitte eine Antwort auf Ihre eigene Frage (// stackoverflow.com/help/self-answer). Dies erleichtert es anderen Benutzern, die Antwort zu finden und zu sehen, dass Ihr Problem gelöst wurde. (Sie können Ihre Antwort nach ein paar Tagen annehmen (// stackoverflow.com/help/accepted-answer).) –

Antwort

1

Ich poste nur meinen Kommentar als Antwort es leichter zu sehen.

Es war nicht die Zugriffsebene des Containers. Es hat auch nichts mit StartCopy zu tun. Es stellte sich heraus, dass es diese Codezeilen waren.

var mediaBlobContainer = cloudBlobClient.GetContainerReference(cloudBlobClient.BaseUri + "temporarymedia"); 
mediaBlobContainer.CreateIfNotExists(); 

Offenbar sollte ich nicht die cloudBlobClient.BaseUri liefern werden, nur den Namen temporarymedia.

var mediaBlobContainer = cloudBlobClient.GetContainerReference("temporarymedia"); 

Es gab jedoch keine relevante Fehlermeldung. Hoffentlich wird es in Zukunft einen weiteren Azure-Neuling retten.