2016-06-15 7 views
3

Ich möchte eine Datei asynchron zum Azure-Blobspeicher hochladen. Ich habe die Art und Weise in der offiziellen sdk vorgeschlagen versucht:Laden Sie eine Datei in den Azure-Blobspeicher.

Dies ist, wie ich den Container erhalten:

public static class BlobHelper 
{ 
    public static CloudBlobContainer GetBlobContainer() 
    { 
     // Pull these from config 
     var blobStorageConnectionString = ConfigurationManager.AppSettings["BlobStorageConnectionString"]; 
     var blobStorageContainerName = ConfigurationManager.AppSettings["BlobStorageContainerName"]; 

     // Create blob client and return reference to the container 
     var blobStorageAccount = CloudStorageAccount.Parse(blobStorageConnectionString); 
     var blobClient = blobStorageAccount.CreateCloudBlobClient(); 
     var container = blobClient.GetContainerReference(blobStorageContainerName); 
     container.CreateIfNotExists(); 
     container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); 
     return container; 
    } 
} 

Und das ist, wie ich versuche, um die Datei zu laden:

var documentName = Guid.NewGuid().ToString(); 

CloudBlobContainer container = BlobHelper.GetBlobContainer(); 

CloudBlockBlob blockBlob = container.GetBlockBlobReference(documentName); 

public class FilesService 
{ 
    public async Task<string> UploadFiles(HttpContent httpContent) 
    { 

     var documentName = Guid.NewGuid().ToString(); 

     CloudBlobContainer container = BlobHelper.GetBlobContainer(); 

     CloudBlockBlob blockBlob = container.GetBlockBlobReference(documentName); 

     using (var fileStream = System.IO.File.OpenRead(@"path\myfile")) 
     { 
      await blockBlob.UploadFromStreamAsync(fileStream); 
     } 

     return blockBlob.Uri.ToString(); 
    } 
} 

Das Problem ist, dass ich nicht weiß, wie ich den Pfad zu meiner Datei bekomme (sie wird vom Benutzer hochgeladen).

Wenn ich versuche, dieses:

var rootpath = HttpContext.Current.Server.MapPath("~/App_Data"); 

var streamProvider = new MultipartFileStreamProvider(rootpath); 

await httpContent.ReadAsMultipartAsync(streamProvider); 
foreach (var file in streamProvider.FileData) 
{ 
    var localName = file.LocalFileName; 
    using (var fileStream = System.IO.File.OpenRead(file.LocalFileName)) 
    { 
     await blockBlob.UploadFromStreamAsync(fileStream); 
    } 
} 

Und wenn ich versuche, eine Post-Anforderung. Die Anfrage stürzt ab und gibt nichts zurück (auch keine Ausnahme);

Lösung:

Das Problem wurde in der folgenden Art und Weise gelöst. Ich habe eine Service-Methode verwendet, um eine Sammlung von Dateien hochladen zu können.

Service Method to upload a collection of blobs

In der BlobHelper Klasse I die benötigten Informationen über den Behälter zu speichern und es dann instanziiert, es ist eine static Klasse. Mithilfe einer Sammlung können mehrere Dateien als Teil desselben Streams hochgeladen werden.

+0

Ich versuche, die Datei hochzuladen! Indem man seinen Weg erhält. – StefanL19

+0

können Sie bitte teilen Sie arbeiten Code-Snippet für das oben genannte Problem? Danke. – Sampath

+0

Ich werde es als eine Erweiterung der Frage hinzufügen. – StefanL19

Antwort

3

Ich denke, Sie versuchen, den Pfad zu der Datei, die in den Blob Storage hochgeladen wird, mithilfe von ASP.NET-Standardmethoden und lokalem Kontext zu erhalten. Auf den Blob hochgeladene Dateien sind auf diese Weise nicht zugänglich.

Scheint so, als ob du deinen Blob richtig hochlädst. Wenn Ihre Datei erfolgreich hochgeladen wurde, sollte Ihre Methode nun blockBlob.Uri.ToString() zurückgeben. Dies ist der Link zu Ihrer Datei - Sie können sie irgendwo in der Datenbank oder an einem anderen Ort speichern.

+0

ja, aber das Problem ist, dass die Anfrage nicht jedes der Teil uri. Es stürzt nur ab, wenn ReadAsMultipartAsync ausgeführt wird. – StefanL19

+0

@ StefanL19 Ich habe den [Chatraum] erstellt (https://chat.stackoverflow.com/rooms/114814/azurestorageissueuload) - wenn Sie eine Zeit haben, lassen Sie uns chatten und sehen, ob wir das Problem lösen können –