在与前端对接项目中,遇到从本地生成二维码并返回的问题:
/// <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;
成功,用字节传递完全没有问题。
总结:在返回数据的时候,确定下返回数据的长度,避免数据流返回不完整(不要直接返回数据流)