2015-05-15 2 views
5

Ich versuche, einen Controller zu erstellen, mit dem ich Bilder in meiner Datenbank speichern kann. Bisher habe ich dieses Bit Code:Zugriff auf eine geschlossene Datei beim Hochladen in den Speicherstream nicht möglich

/// <summary> 
/// Handles an upload 
/// </summary> 
/// <returns></returns> 
[HttpPost] 
[Route("")] 
public async Task<IHttpActionResult> Upload() 
{ 

    // If the request is not of multipart content, then return a bad request 
    if (!Request.Content.IsMimeMultipartContent()) 
     return BadRequest("Your form must be of type multipartcontent."); 

    // Get our provider 
    var provider = new MultipartFormDataStreamProvider(ConfigurationManager.AppSettings["UploadFolder"]); 

    // Upload our file 
    await Request.Content.ReadAsMultipartAsync(provider); 

    // Get our file 
    var file = provider.Contents.First(); 
    var bytes = await file.ReadAsByteArrayAsync(); 

    // Using a MemoryStream 
    using (var stream = new MemoryStream(bytes)) 
    { 

     stream.Seek(0, SeekOrigin.Begin); 

     // Create the data 
     var data = "data:image/gif;base64," + Convert.ToBase64String(stream.ToArray()); 

     // Return the data 
     return Ok(data); 
    } 
} 

Aber es funktioniert nicht. Als ich die bekommen in mit Block erhalte ich eine Fehlermeldung:

„Fehler bei einem Bach das Kopieren von Inhalten“
"Kann nicht auf eine geschlossene Datei zugreifen."

Weiß jemand warum?

+0

Können Sie meine Antwort unten überprüfen, um zu sehen, ob es Ihnen geholfen hat? – Rtype

+0

Wenn Sie meine Antwort als Antwort markieren könnten oder wenn es nicht helfen würde, Feedback zu geben, kann ich meine Antwort aktualisieren, um Sie besser zu unterstützen. – Rtype

+0

Vielen Dank für die Kennzeichnung meiner als Antwort! :) – Rtype

Antwort

5

Der Grund, warum dies geschieht, ist der MultipartFormDataStreamProvider geschlossen und verfügt die hochgeladenen Dateien Ströme, nachdem sie die hochgeladenen Daten zum Speicherort der Datei geschrieben hat Sie zur Verfügung gestellt, wenn Sie dies in den Konstruktor übergeben: ConfigurationManager.AppSettings [ „UploadFolder“]

um die Dateien zugreifen, die Sie die Dateidaten auf der Festplatte aus der hochgeladenen Datei Standort konsultieren müssen hochgeladen wurden:

So in Ihrem Beispiel Ihr Code muss verwenden, um dies:

// Read the first file from the file data collection: 
var fileupload = provider.FileData.First; 

// Get the temp name and path that MultipartFormDataStreamProvider used to save the file as: 
var temppath = fileupload.LocalFileName; 

// Now read the file's data from the temp location. 
var bytes = File.ReadAllBytes(temppath); 

Zusätzlich wenn Ihre sehr kleine Dateien verwenden, können Sie stattdessen verwenden:

MultipartMemoryStreamProvider

Diese die Dateidaten im Speicher speichert und sollte wie erwartet funktionieren. Seien Sie jedoch gewarnt, wenn Sie große Dateien (25 MB +) verwenden, sollten Sie zuerst auf die Festplatte streamen, andernfalls können Sie die Speicherausnahme verlieren, da .net versucht, die gesamte Datei im Speicher zu halten.

Verwandte Themen