【问题标题】:How use the Byte Array of a image?如何使用图像的字节数组?
【发布时间】:2017-01-17 18:52:03
【问题描述】:

所以,我从 Oracle 获取 LongRaw 图像的字节数组... 我正在为此使用webapi。得到数组后,我如何在客户端使用它? 我转换为base64string并在客户端传递这个值转换会更好吗?

cmd.InitialLONGFetchSize = -1;
                var reader = cmd.ExecuteReader();

                if (reader.Read())
                {
                    // Fetch the LONG RAW
                    OracleBinary imgBinary = reader.GetOracleBinary(0);
                    // Get the bytes from the binary obj
                    byte[] imgBytes = imgBinary.IsNull ? null : imgBinary.Value;

                    //var imgString = Uri.EscapeDataString(Convert.ToBase64String(imgBytes));
                }

                //CRIO A LISTA
                lretorno.Load(reader, LoadOption.OverwriteChanges, "BUSCAFOTO");

                reader.Close();

                connection.Close();
                connection.Dispose();

                var teste = lretorno.Tables[0].AsEnumerable().Select(row => new FotoEnvolvido
                {
                    FOTO = (byte[])(row["FOTO"]),
                    //FOTO = Convert.ToString(row["FOTO"]),
                });

                return teste;

【问题讨论】:

    标签: c# json asp.net-web-api bytearray


    【解决方案1】:

    您可以编写一个返回图像二进制数据的 Web API 控制器。 Base64 字符串强加了必须传输的字节数量的开销。请避免这种情况。

    一个示例控制器可以如下所示:

    public class WebApiController : ApiController
    {        
        public async Task<HttpResponseMessage> Get(string id)
        {
            var bytes = await GetBytesFromDataLayerAsync(id);
    
            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            var stream = new MemoryStream(bytes);
            result.Content = new StreamContent(stream);
            result.Content.Headers.ContentType =
                new MediaTypeHeaderValue("image/jpeg");
            return result;
        }
    
        private async Task<byte[]> GetBytesFromDataLayerAsync(string id)
        {
            // put your Oracle logic here
            return ...
        }
    }
    

    【讨论】:

    • 我需要加密我的 Json 的内容......我对所有字符串都这样做了......但是,现在有了这些 ByteArray,我认为在传递图像之前最好先转换,是不是??
    • 您的代码运行良好,我的朋友...非常感谢!!我只是有另一个问题..
    • 为什么需要加密 JSON 的内容?通常它们受 SSL/TLS 保护.... https... - 但是如果您对加密/解密还有其他问题,您应该在 SO 上发布一个新问题。
    • 哦,伙计们...我不知道!我只知道我需要......哈哈我已经告诉他们了,但是安全部门不正常
    • 天哪 - 我什至无法想象一个解决方案。浏览器必须解密 JSON 数据(这可以通过在 JavaScript 端传输加密的 Json-String + 加密来完成(任何人都可以访问此代码)。也许有一些好的 JavaScript 库。但这是一个全新的主题(和另一篇文章)。祝你好运!
    【解决方案2】:

    根据您作为 rboe 所说的将字节直接写入客户端将节省一些数据大小(大约 37%)和计算开销。如果您不仅要显示 jpeg 图像,还应该将 mime-type 设置为正确的值...查看this source 以获得一组相当完整的 mime-type 映射扩展。如果您不知道 MIME 类型,可以尝试“application/octet-stream”,因为这是二进制数据的通用 MIME 类型。

    如果您通过网络浏览器显示您的内容,您可以使用&lt;img&gt; 标签,例如&lt;img src="view_image.aspx?id=5"&gt;,您甚至可以使用 javascript/jQuery 动态创建。

    如果您确实希望将图像数据嵌入到 json 请求中,如果您有很多小图标并且不想要大量请求(使用 http/2,我认为这无关紧要),这可能会很有用) 或其他原因,那么是的,首先使用...对二进制数据进行编码

    string base64EncodedData = Convert.ToBase64String(bytes);
    

    如果客户端是javascript,你可以使用最新的浏览器原生函数解码

    var decodedImageData = window.atob(base64EncodedData);
    

    见:

    如果您只是将其发送到另一个 c# 端点,您可以使用...

    byte[] decodedImageData = Convert.FromBase64String(base64EncodedData);
    

    就像我在评论中提到的那样,确保它是加密的,只是让网站只支持 https://,如果你没有 SSL 证书,你可以从http://startssl.com免费获得一个

    【讨论】:

    • 我的朋友...感谢您的解释!太棒了....但是,我已经在我的工作中告诉大家这个(ssl“加密”)并且没关系......所有协议都通过HTTPS,但他们仍然需要我加密数据。哦,我正在使用 xamarin c# 从 web api 捕获数据。
    • @MarceloCFernandes 由于您仍然需要加密方面的帮助,因此我查找了您的其他加密 json 问题并在那里发布了答案。除了 json 之外,您基本上可以使用相同的代码来加密图像请参阅:stackoverflow.com/questions/38962083/… 如果适合您,请标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多