1

Ich versuche, eine IFormFile über eine .net Core-Web-API zu einem azure Blob-Speicher hinzugefügt. Dies sind die Eigenschaften Ich habe ein:Hinzufügen zu azurblauen Blob Speicher mit Stream

static internal CloudStorageAccount StorageAccount => 
    new CloudStorageAccount(new StorageCredentials(AccountName, AccessKey, AccessKeyName), true); 

// Create a blob client. 
static internal CloudBlobClient BlobClient => StorageAccount.CreateCloudBlobClient(); 

// Get a reference to a container 
static internal CloudBlobContainer Container(string ContainerName) 
         => BlobClient.GetContainerReference(ContainerName); 

static internal CloudBlobContainer ProfilePicContainer 
     => Container(ProfilePicContainerName); 

Jetzt benutze ich die ProfilePicContainer wie folgt aus:

var Container = BlobStorage.ProfilePicContainer; 
string fileName = Guid.NewGuid().ToString("N") + Path.GetExtension(ProfileImage.FileName); 
var blockBlob = Container.GetBlockBlobReference(fileName); 
var fileStream = ProfileImage.OpenReadStream(); 
fileStream.Position = 0; 
await blockBlob.UploadFromStreamAsync(fileStream); 

Das gibt mir die folgende Fehlermeldung:

Microsoft.WindowsAzure.Storage.StorageException: 'Cannot access a closed Stream.'

Inner Exception ObjectDisposedException: Cannot access a closed Stream.

Wenn das Debuggen, ich habe bemerkt, noch bevor fileStream.Position = 0 es ist Position ist bereits 0. Allerdings habe ich die Zeile seit ich diesen Fehler bekam. Ebenfalls auf der Wartezeile ist die fileStream_disposed auf false gesetzt.

Darüber hinaus habe ich in Bezug auf die Blob-Verbindung versucht, einen ungültigen Wert für die Zeichenfolge Konstante AccessKey und es zeigt genau den gleichen Fehler. Was bedeutet, dass ich keine Ahnung habe, ob es sogar eine Verbindung gibt. Ich habe alle Werte innerhalb blobBlock im Debugger überprüft, aber ich habe keine Ahnung, wie man überprüft, ob es verbunden ist.

+0

Es klingt wie 'fileStream' bereits geschlossen ist und nicht ein Problem mit dem Azure-Speicher sdk? Können Sie überhaupt auf den Stream "fileStream" zugreifen? Kann man es mit etwas wie 'using (var testStream = Datei.OpenWrite (Path.GetTempFileName())) auf die Festplatte schreiben? FileStream.CopyTo (testStream)'? –

+0

ja habe versucht den FileStream in die Datei zu schreiben und in Bytes zu schreiben. beides funktioniert gut. –

+0

Versuchen Sie, den Stream in einen Block –

Antwort

0

Es scheint ein Problem zu geben, wenn versucht wird, direkt aus dem Stream zu schreiben. Ich konnte den Code ausführen, indem ich den Stream in ein Byte-Array umwandelte.

await blockBlob.UploadFromByteArrayAsync(ReadFully(fileStream, blockBlob.StreamWriteSizeInBytes), 
          0, (int)fileStream.Length); 

Die ReadFully war eine Modifikation über diese Antwort https://stackoverflow.com/a/221941

static byte[] ReadFully(Stream input, int size) 
{ 
    byte[] buffer = new byte[size]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = input.Read(buffer, 0, size)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 
Verwandte Themen