2016-07-11 8 views
2

Ich versuche, eine Datei hochzuladen und in den Azure Blob-Speicher zu speichern. Die Datei wird als FormFile eingefügt. Das Problem besteht darin, dass beim Konvertieren des FormFile in einen Speicherstream Fehler auftreten. Der Stream wird dann nach Azure hochgeladen, enthält jedoch keine Daten.Fehler beim Konvertieren der Formulardatei in den Speicherstream

public async Task<IActionResult> Create([Bind("EndorsementId,FileName,ProviderId,Title")] Endorsement endorsement, IFormFile formFile) 
    { 
     if (ModelState.IsValid) 
     { 
      ... 
      var data = new MemoryStream(); 

      formFile.CopyTo(data); 
      var buf = new byte[data.Length]; 
      data.Read(buf, 0, buf.Length); 

      UploadToAzure(data); 

      ... 

Die Fehler betreffen die ReadTimeOut- und WriteTimeOut-Eigenschaften des Speicherstreams. Sie sagen 'data.ReadTimeout' hat eine Ausnahme vom Typ 'System.InvalidOperationException' ausgelöst und 'data.WriteTimeout' hat eine Ausnahme vom Typ 'System.InvalidOperationException' ausgelöst.

Hier ist, wie ich die FormFile injiziert. Es scheint sehr wenig Information darüber zu geben. http://www.mikesdotnetting.com/article/288/uploading-files-with-asp-net-core-1-0-mvc

Vielen Dank im Voraus.

+0

Seitliche Anmerkung: Ignorieren der Ergebnisse von Lesen/Schreiben Operationen auf Streams ist in der Regel schlechte Idee. –

Antwort

1

Der Offset des MemoryStream befindet sich immer noch am Ende der Datei, nachdem Sie die Daten ausgefüllt haben. Sie können entweder setzen Sie die Position:

var data = new MemoryStream(); 

formFile.CopyTo(data); 
// At this point, the Offset is at the end of the MemoryStream 
// Either do this to seek to the beginning 
data.Seek(0, SeekOrigin.Begin); 

var buf = new byte[data.Length]; 
data.Read(buf, 0, buf.Length); 

UploadToAzure(data); 

Oder, anstatt sich die ganze Arbeit tun, können Sie machen MemoryStream kopieren Sie einfach die Daten aus für Sie zu einem byte[] Array, indem Sie diese nach dem CopyTo() Aufruf:

// Or, save yourself some work and just do this 
// to make MemoryStream do the work for you 
UploadToAzure(data.ToArray()); 
1

IFormFile hat CopyToAsync Methode für diesen Zweck. Sie können einfach etwas wie unten tun:

using (var outputStream = await blobReference.OpenWriteAsync()) 
{ 
    await formFile.CopyToAsync(outputStream, cancellationToken); 
}