Использование CryptoStream с StreamContent C#

Я хотел бы прочитать изображение из файлового или блоб-хранилища, а base64 закодировать его как поток, а затем передать этот поток в StreamContent. Время ожидания следующего кода:

[HttpGet, Route("{id}", Name = "GetImage")]
public HttpResponseMessage GetImage([FromUri] ImageRequest request)
{
   var filePath = HostingEnvironment.MapPath("~/Areas/API/Images/Mr-Bean-Drivers-License.jpg");
   HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
   var stream = new FileStream(filePath, FileMode.Open);
   var cryptoStream = new CryptoStream(stream, new ToBase64Transform(), CryptoStreamMode.Write);
   result.Content = new StreamContent(cryptoStream);
   result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

   return result;
}

Я могу заставить следующий код работать без сохранения файла в виде потока и прочитать все это в память, но я хотел бы избежать этого.

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
using (var fileStream = new FileStream(filePath, FileMode.Open))
{
    using (var image = Image.FromStream(fileStream))
    {
        var memoryStream = new MemoryStream();
        image.Save(memoryStream, image.RawFormat);

        byte[] imageBytes = memoryStream.ToArray();

        var base64String = Convert.ToBase64String(imageBytes);
        result.Content = new StringContent(base64String);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
        return result;
    }
}

0 ответов

Проблема в том, что вы проходите CryptoStreamMode.Write конструктору CryptoStream тогда как вы должны пройти CryptoStreamMode.Read поскольку CryptoStream будет читаться как HttpResponseMessage возвращается.

Для получения дополнительной информации об этом см. Прекрасное объяснение Фиголу о различных способах использования CryptoStreamв этом ответе.

Другие вопросы по тегам