Использование 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
в этом ответе.