剑轩

.net core gRPC base64上传图片,文件

电脑版发表于:2020/2/5 15:20

客户端

前台

<div>
    <input type="file" onchange="selectImage(this.files)" accept="">
</div>

<script>
    function selectImage(files) {
        let reader = new FileReader();
        let file = files[0];
        console.log(file);

        //取出来文件的后缀名(方便在后台保存的时候用)
        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/UpLoadFile', { filecontent: reader.result, fileExt: fileExt }, function (result) {
            });
        }
    }
</script>

客户端调用gRPC:

/// <summary>
        /// 调用gRPC base64图片上传
        /// </summary>
        public void UpLoadFile()
        {
            string base64 = Request.Form["filecontent"];
            string fileExt = Request.Form["fileExt"];

            #region base64需要把前面的申明去掉(当然前缀这个也可以放在前端处理)
            //string newbase = base64.Replace("data:image/jpeg;base64,", "");
            //这里用了一下正则表达式因为可能是格式data:image/jpeg;base64,data:image/png;base64等等
            string base64img = Regex.Replace(base64, "data:image/.*;base64,", "");
            //文本格式(注意不同格式可能需要你针对性的写不同的格式去去掉base64前面的内容,不然会报格式不对的错)
            string base64img = Regex.Replace(base64, "data:text/.*;base64,", ""); 
            #endregion

            //设置允许不安全的HTTP2支持
            AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
            var channel = GrpcChannel.ForAddress("http://localhost:8099/");
            var client = new UpImg.UpImgClient(channel);
            var reply = client.DoUpLoad(new UpImgRequest { Img = base64img, FileExt = fileExt });
            string ss = reply.Message;
        }

gRPC服务端

proto:

syntax = "proto3";

option csharp_namespace = "GrpcService1";

package UpImg;

// The greeting service definition.
service UpImg {
  // Sends a greeting
  rpc DoUpLoad (UpImgRequest) returns (UpImgReply);
}

// The request message containing the user's name.
message UpImgRequest {
  string img=1;
  string fileExt=2;
}

// The response message containing the greetings.
message UpImgReply {
  string message = 1;
}

实现服务:

public class UpImgService : UpImg.UpImgBase
    {
        private readonly ILogger<GreeterService> _logger;
        public UpImgService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

        public override Task<UpImgReply> DoUpLoad(UpImgRequest request, ServerCallContext context)
        {
            string base64img = request.Img;
            string fileExt = request.FileExt;

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

            return Task.FromResult(new UpImgReply
            {
                Message = "上传成功!"
            });
        }
    }

base64工具类:

public class Base64Convert
    {
        /// <summary>
        /// 文件转换成Base64字符串
        /// </summary>
        /// <param name="fileName">文件绝对路径</param>
        /// <returns></returns>
        public static String FileToBase64(string fileName)
        {
            string strRet = null;

            try
            {
                FileStream fs = new FileStream(fileName, FileMode.Open);
                byte[] bt = new byte[fs.Length];
                fs.Read(bt, 0, bt.Length);
                strRet = Convert.ToBase64String(bt);
                fs.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return strRet;
        }

        /// <summary>
        /// Base64字符串转换成文件
        /// </summary>
        /// <param name="strInput">base64字符串</param>
        /// <param name="fileName">保存文件的绝对路径</param>
        /// <returns></returns>
        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;
        }
    }


下载地址:http://www.tnblog.net/resource/show/aojiancc2/af3134fbbe174025ad34e7ccf7de465f

关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢