菜的像徐坤
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

gRPC 跨项目传图片

4829人阅读 2021/6/11 16:39 总访问:856889 评论:0 收藏:0 手机
分类: API

前言

添加一个新的gRPC项目

添加一个服务,需要添加一个中间件

 endpoints.MapGrpcService<服务名>();

客户端部分

客户端设置一个提交图片的按钮

 //js部分
  $(function () {
        $("#sub").click(function myfunction() {
            var files = $('#file').prop('files');

            var data = new FormData();
            data.append('avatar', files[0]);

            let reader = new FileReader();
            let file = files[0];

            //取出来文件的后缀名(方便在后台保存的时候用)
            var index = file.name.lastIndexOf(".");
            var fileExt = file.name.substr(index + 1);
            console.log(fileExt);

            reader.readAsDataURL(file);
            reader.onload = function () {
                console.log(reader.result);
                $.post('/Home/Upimg', { filecontent: reader.result, fileExt: fileExt }, function (result) {
                });
            }
        })
    })
    
    //前台部分
      <form method="post" action="/Home/Upimg" enctype="multipart/form-data">
        <input name="file" id="file" type="file" />
        <input type="button" id="sub"  value="提交" />
      </form>

客户端后台设置请求gRPC服务器

客户端中加入gRPC依赖

<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.11.2" />
<PackageReference Include="Grpc.Net.Client" Version="2.26.0" />
<PackageReference Include="Grpc.Tools" Version="2.26.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

调用本地gRPC服务
调用服务的项目需要有一个与服务一模一样的gRPC原生(需要调用的保持一致即可)

后台处理

 //将图片解析成base64编码
 public IActionResult Upimg(string filecontent,string fileExt)
        {
           
            #region base64需要把前面的申明去掉(当然前缀这个也可以放在前端处理)
            //string newbase = base64.Replace("data:image/jpeg;base64,", "");
            //这里用了一下正则表达式因为可能是格式data:image/jpeg;base64,data:image/png;base64等等
            string base64img = Regex.Replace(filecontent, "data:image/.*;base64,", "");
            #endregion

            //设置允许不安全的HTTP2支持
            AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
            var channel = GrpcChannel.ForAddress("http://localhost:5001/");
            var client = new UpImg.UpImgClient(channel);
            //传递图片信息与后缀
            var reply = client.UpLond(new UpImgRequest { Img = base64img, FileExt = fileExt });
            string ss = reply.Message;

            return View();
        }

服务器部分

gRPC服务器

访问服务器时,将请求中传递的参数解析成图片

     public override Task<UpImgReply> UpLond(UpImgRequest request,ServerCallContext context)
        {
            //调用base64的工具类实现图片上传

            string base64img = request.Img;
            string fileExt = request.FileExt;

            //把图片存储到d盘,具体操作的时候位置可以自行改变
            Base64ToFileAndSave(base64img, "d://" + Guid.NewGuid().ToString().Replace("-", "") + "." + fileExt);

            return Task.FromResult(new UpImgReply
            {
                Message = "上传成功!"
            });
         }
         
         //将图片存储到指定路径的方法
         public static bool Base64ToFileAndSave(string strInput, string fileName)
        {
            bool bTrue = false;

            try
            {
                byte[] buffer = Convert.FromBase64String(strInput);
                FileStream fs = new FileStream(fileName, FileMode.CreateNew);
                fs.Write(buffer, 0, buffer.Length);
                fs.Close();
                bTrue = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return bTrue;
        }

最后图片就上传到指定的路径里了

评价