2015-09-17 2 views
1

У меня есть следующие действия:Невозможно вернуть поток изображения из действий в ASP.NET MVC

public async Task<ActionResult> Get(string path) 
{ 
    StaticImage image = await _images.UseRepositoryAsync(repo => repo.ReadAsync(path)); 
    return image != null ? new FileStreamResult(image.Stream, "image/jpeg") : (ActionResult)HttpNotFound(); 
} 

У меня есть общие стратегии сохранения состояния (использует Amazon S3), который извлекает StaticImage следующим образом:

//E is StaticImage in this case 
//The returned entity is not disposed, it leaves that responsability to the controller 
//However, the response IS disposed, that's why I need to copy the stream 
public async Task<E> SelectAsync(params object[] keys) 
{ 
    using(GetObjectResponse response = await MakeGetObjectRequestAsync(keys.First().ToString())) 
    { 
      if(response == null) return default(E); 

      E entity = CreateEntity(); 
      entity.Key = response.Key; 

      Stream entityStream = new MemoryStream(Convert.ToInt32(response.ResponseStream.Length)); 
      await response.ResponseStream.CopyToAsync(entityStream); 
      entity.Stream = entityStream; 

      return entity; 
    } 
} 

response.ResponseStream содержит содержимое изображения в:

enter image description here

И копируется нормально к новому потоку (см Length):

enter image description here

Однако 0 байт возвращаются из моего контроллера:

enter image description here

ответ

4

Если посмотреть на ваше второе изображение, позиция потока - 197397. Мое предположение заключается в том, что когда вы передаете его конструктору FileStreamResult, он не копирует его, потому что позиция находится в конце потока. Перед тем, как передать его конструктору FileStreamResult, установите позицию на 0:

StaticImage image = await _images.UseRepositoryAsync(repo => repo.ReadAsync(path));  
image.Stream.Position = 0; 
return image != null ? new FileStreamResult(image.Stream, "image/jpeg") : (ActionResult)HttpNotFound(); 
+0

Спасибо! Не могу поверить, что это была проблема! : P –

+0

@MatiCicero без проблем. Это обычная проблема при работе с потоками. –

Смежные вопросы