2015-05-15 30 views
5

Görüntüleri veritabanıma kaydetmeme izin verecek bir denetleyici oluşturmaya çalışıyorum. Şimdiye kadar bende bu kod var:Bellek akışına yüklerken kapalı bir dosyaya erişilemiyor

/// <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); 
    } 
} 

Ama çalışmıyor.

"Hata akışı içerik kopyalanırken": Ne bloğunu kullanmayı olsun bir hata mesajı almak
"Kapalı bir dosyaya erişilemiyor."

Nedenini bilen var mı? bu oluyor

+0

Size yardımcı olup olmadığını görmek için aşağıdaki cevabımı tekrar gözden geçirebilir misiniz? – Rtype

+0

Yanıtımı bir yanıt olarak işaretleyebilirseniz veya bazı geri bildirim sağlamaya yardımcı olmadıysa, daha iyi yardımcı olmak için yanıtımı güncelleyebilirim. – Rtype

+0

Cevabımı benim olarak işaretlediğiniz için teşekkür ederiz! :) – Rtype

cevap

5

nedeni MultipartFormDataStreamProvider kapatır ve bunu yapıcı içine bu geçti verdiğiniz dosya konumuna yüklenen verileri yazmış sonra yüklenen dosyalar akışları elden geçerli: ConfigurationManager.AppSettings [ "UploadFolder"]

// 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); 
:

sizin örnekte Yani

kodunuzu Bunu kullanmak gerekir:

yüklediğiniz dosya konumundan diskteki dosya verilerden yararlanmak gerek yüklenmiş olan dosyalara erişmek için senin çok küçük dosyalarını kullanarak eğer

Ayrıca bunun yerine kullanabilirsiniz:

MultipartMemoryStreamProvider

Bu bellekte dosya veri depolayan ve beklendiği gibi çalışması gerekir. Büyük dosyaları (25mb +) ilk olarak diske akış için akıllıca kullanırsanız, uyarılmalıdır. Aksi takdirde .net, bellekte tüm dosyayı tutmaya çalıştığında bellek istisnalarından kurtulabilir.

İlgili konular