首页后端开发ASP.NETAsp.net使用SignalR实现发送图片

Asp.net使用SignalR实现发送图片

时间2024-01-30 22:11:02发布访客分类ASP.NET浏览933
导读:收集整理的这篇文章主要介绍了Asp.net使用SignalR实现发送图片,觉得挺不错的,现在分享给大家,也给大家做个参考。一、引言 在前一篇已经介绍了如何使用SignalR来实现聊天室的功能,在这篇文章中,将实现如何使用SignalR来实...
收集整理的这篇文章主要介绍了Asp.net使用SignalR实现发送图片,觉得挺不错的,现在分享给大家,也给大家做个参考。一、引言
  在前一篇已经介绍了如何使用SignalR来实现聊天室的功能,在这篇文章中,将实现如何使用SignalR来实现发送图片的功能。

二、实现发送图片的思路
  我还是按照之前的方式来讲述这篇文章,首先,让我们来理清下实现发送图片功能的思路。

  图片的显示,除了直接指定图片的路径外(这种实现方式也称为:http URI schema),还可以通过Data Uri Schema的方式来显示图片。这种方式允许在网页里以字符串形式直接内嵌图片。形式如下所示:

img src="data:image/png;
    base64,ivbORw0KGgoAAAANSUhEUgAAAAQAAAADCaiAAAA 7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC" />
    

  上面代码的方式就是Data Url Schema方式来显示图片。关于Data Uri Schema的优缺点有:

优点:
  可以减少Http请求,因为如果你使用http Uri Schema去指定图片地址的话,这样客户端对每个图片都需要发出Http请求,通过使用Data Uri的方式可以节省带宽和Http请求

缺点:

  IE8以上的版本才支持,且限制大小不可超过32KB。
  另外Base64的内容会将图片的内容变大33%,但可以通过服务端启用GZIP压缩来减少增大内容。尽管这样,由于发送Http请求会附加很多额外的信息(如Http Header等),这样累计下来一般内容大小还是大于使用Base64编码所增加的内容。

  因为SignalR是基于文本方式的传输,所以要实现图片的发送。

只能通过发送图片的Base64编码的字符串到SignalR服务器,然后服务器再将该Base64字符串推送到需要接收图片的客户端,客户端再使用Data Uri的方式将图片显示在页面上,从而完成图片的传输。
  当然你也可以像Jabbr(一个使用SignalR实现即时聊天的开源项目)那样将图片上传到Azure Bob Table中,然后再将Blob 的Uri 返回所有客户端来显示图片。其实这样的实现方式和我们这里实现类似,客户端可以通过blob的Uri来读取到图片来显示。总之实现思路就是将图片二进制文件的内容间接转换成文本的形式传输。

三、使用SignalR发送图片的实现代码
  在具体实现之前,这里需要介绍一个文件上传插件——boostrap-fileinput。该插件用来提供图片的预览功能。关于插件的具体使用可以参考gIThub站点或本文章的实现代码。

1、实现我们的集线器

public class ChatHub : Hub  {
        /// summary>
        /// 供客户端调用的服务器端代码    /// /summary>
        /// param name="name">
    /param>
        /// param name="message">
    /param>
    public void Send(string name,string message)    {
          // 调用所有客户端的sendMessage方法      Clients.All.sendMessage(name, message);
    }
         // 发送图片    public void SendImage(string name,IEnumerableImageData>
 images)    {
          foreach (VAR item in images ?? Enumerable.EmptyImageData>
())      {
            if(String.IsNullOrEmpty(item.Image)) continue;
            Clients.All.receiveImage(name, item.Image);
 // 调用客户端receiveImage方法将图片进行显示      }
    }
         /// summary>
        /// 客户端连接的时候调用    /// /summary>
        /// returns>
    /returns>
    public override Task OnConnected()    {
          Trace.WriteLine("客户端连接成功");
          return base.OnConnected();
    }
  }
    

2、HomeController的实现代码,主要为每个客户端生成随机的用户名,再将用户名存入Session中。

public class HomeController : Controller  {
    PRivate static readonly char[] Constant =    {
      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',      'w', 'x', 'y', 'z',      'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',      'W', 'X', 'Y', 'Z'    }
    ;
     // GET: Home    public ActionResult Index()    {
          Session["username"] = GenerateRandomName(4);
          return View();
    }
         /// summary>
        /// 产生随机用户名函数    /// /summary>
        /// param name="length">
    用户名长度/param>
        /// returns>
    /returns>
    private static string GenerateRandomName(int length)    {
          var newRandom = new System.Text.StringBuilder(62);
          var rd = new Random(DateTime.Now.Millisecond);
          for (var i = 0;
     i  length;
 i++)      {
            newRandom.ApPEnd(Constant[rd.Next(62)]);
      }
           return newRandom.ToString();
    }
}
    

3、接下来就是实现前端页面了。

htML>
    head>
      meta name="viewport" content="width=device-width" />
      title>
    使用SignalR实现发送图片/title>
      link href="/Content/bootstrap.min.css" rel="stylesheet">
      link href="/Content/bootstrap-fileinput/css/fileinput.min.css" media="all" rel="stylesheet" type="text/css" />
    /head>
    body>
      p class="container">
        p>
    用户名:p id="username">
    /p>
    /p>
        input type="text" id="message" />
        br/>
        br />
        input id="fileinput" type="file">
        br />
        input type="button" id="sendmessage" value="Send" />
        input type="hidden" id="displayname" />
        ul id="discussion">
    /ul>
      /p>
      script type="text/javascript" src="~/Scripts/jquery-2.2.2.min.js">
    /script>
      script src="~/Scripts/jquery.signalR-2.2.0.min.js">
    /script>
      script src="~/signalr/hubs">
    /script>
      script src="/Scripts/fileinput.js" type="text/javascript">
    /script>
      script src="/Scripts/bootstrap.min.js" type="text/javascript">
    /script>
      script>
    $(function () {
          var userName = '@Session["username"]';
          $('#username').html(userName);
          // 引用自动生成的集线器代理      var chat = $.connection.chatHub;
      // 定义服务器端调用的客户端sendMessage来显示新消息       chat.client.sendMessage = function (name, message) {
            // 向页面添加消息        $('#discussion').append('li>
    strong>
    ' + htmlEncode(name)          + '/strong>
    : ' + htmlEncode(message) + '/li>
    ');
      }
    ;
       chat.client.receiveImage = function (name, base64) {
            // 向页面添加消息        $('#discussion').append('image class = "file-preview-image" style="width:auto;
    height:100px;
    " src=' + base64          + '/>
    ');
      }
    ;
           // 设置焦点到输入框      $('#message').focus();
      // 开始连接服务器      $.connection.hub.start().done(function () {
        $('#sendmessage').click(function () {
              // 调用服务器端集线器的Send方法          chat.server.send(userName, $('#message').val());
              // 清空输入框信息并获取焦点          $('#message').val('').focus();
        }
    );
      }
    );
       $("#fileinput").fileinput({
        AllowedFileextensions: ["jpg", "png", "gif", "jpeg"],        maxImageWidth: 700,        maxImageHeight: 700,        resizePreference: 'height',        maxFileCount: 1,        resizeImage: true      }
    );
       $("#fileinput").on('fileloaded', function (event, file, previewId, index, reader) {
            var readers = new FileReader();
        readers.onloadend = function () {
              $(".file-preview-image").attr('src', readers.result);
        }
    ;
            readers.readAsDataURL(file);
      }
    );
       $('#sendmessage').click(function() {
        var imagesJSON = $('.file-preview-image').map(function() {
              var $this = $(this);
          return {
            image: $this.attr('src'),            filename: $this.attr('data-filename')          }
    ;
        }
    ).toArray();
             chat.server.sendImage(userName, imagesJson);
      }
    );
    }
    );
   // 为显示的消息进行Html编码  function htmlEncode(value) {
        var encodedValue = $('p />
    ').text(value).html();
        return encodedValue;
  }
      /script>
       /body>
    /html>
    

四、运行效果
  经过上面的三步,使用SignalR发送图片的功能就已经可以运作了。接下来让我们一起看看具体的运行效果到底如何。

到这里,本文的所有内容的介绍就结束了,接下来的将介绍如何使用Html5 Notification API 来实现有新消息的提醒功能。

更多Asp.net使用SignalR实现发送图片相关文章请关注PHP中文网!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

上一篇: .net Elasticsearch入门实例详解下一篇: Oracle Clob字段过长保存出错改...猜你在找的ASP.NET相关文章 C# 一些面试试题的实例教程2022-05-16.NET 6开发TodoList应用之请求日志组件HttpLogging介绍2022-04-16.NET 6中间件Http Logging使用介绍2022-04-16gojs一些实用的高级用法2022-04-16.NET6开发TodoList应用之实现查询排序2022-04-16.NET6开发TodoList应用之实现数据塑形2022-04-16.NET微服务架构CI/CD自动打包镜像2022-04-16Asp.Net Core 使用Monaco Editor 实现代码编辑器功能2022-04-16.NET微服务架构CI/CD自动构建Jenkins+Gitee2022-04-16.Net Core微服务网关Ocelot集成Consul2022-04-16 其他相关热搜词更多phpjavapython程序员loadpost-format-gallery

若转载请注明出处: Asp.net使用SignalR实现发送图片
本文地址: https://pptw.com/jishu/593103.html
javascript怎么判断元素是否在数组中 javascript怎么去除字符串的所有逗号

游客 回复需填写必要信息