1

我想从文件或 blob 存储中读取图像并将其 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;
    }
}
4

1 回答 1

2

这里的问题是你传递CryptoStreamMode.Write给构造函数,CryptoStream而你应该传递,CryptoStreamMode.Read因为将在返回CryptoStream时读取HttpResponseMessage

有关此问题的更多详细信息,请参阅 Figolu 关于此答案CryptoStream中各种用法的精彩解释。

于 2020-06-19T17:33:19.873 回答