服务端生成图片或二维码并返回

在与前端对接项目中,遇到从本地生成二维码并返回的问题:

 /// <summary>  
        /// 生成二维码  
        /// </summary>  
        /// <param name="content">内容</param>
        /// <param name="moduleSize">二维码的大小</param>
        /// <returns>输出流</returns>  
        public static MemoryStream GetQRCode(string content, int moduleSize = 9)
        {
            //ErrorCorrectionLevel 误差校正水平
            //QuietZoneModules     空白区域 
            var encoder = new QrEncoder(ErrorCorrectionLevel.M);
            QrCode qrCode = encoder.Encode(content);
            GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(moduleSize, QuietZoneModules.Two), Brushes.Black, Brushes.White);

            MemoryStream memoryStream = new MemoryStream();
            render.WriteToStream(qrCode.Matrix, ImageFormat.Jpeg, memoryStream);

            return memoryStream;

            //生成图片的代码
            //DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width);            
            //Bitmap map = new Bitmap(dSize.CodeWidth, dSize.CodeWidth);
            //Graphics g = Graphics.FromImage(map);
            //render.Draw(g, qrCode.Matrix);
            //map.Save(fileName, ImageFormat.Jpeg);//fileName为存放的图片路径
        }

一开始:直接返回数据流

 return  HttpResponse(HttpStatusCode.NoContent, new { QR = stream });

然而图片总是崩掉,一开始以为是传递http协议响应头的类型问题。

可是试过多种类型,还是失败。最后考虑是否是在返回的过程中数据流读取不完全造成的问题。

                var fs = QR.GetQRCode(url);
                byte[] buffer = new byte[fs.Length];
                fs.Position = 0;
                fs.Read(buffer, 0, (int)fs.Length);
                //  return  HttpResponse(HttpStatusCode.NoContent, new { QR = stream });
                HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = new StreamContent(new MemoryStream(buffer));


                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = System.Web.HttpUtility.UrlEncode("文件.jpg")
                };

                return response;

成功,用字节传递完全没有问题。

总结:在返回数据的时候,确定下返回数据的长度,避免数据流返回不完整(不要直接返回数据流)

  

猜你喜欢

转载自www.cnblogs.com/cyj0923/p/9469917.html