我想在服务器端动态生成图像并将其发送到浏览器.
目前我正在使用a MemoryStream
将其转换为byte array
通常的suave api.见下文:
let draw (text:string) =
let redBr = new SolidBrush(Color.Red)
let whiteBr = new SolidBrush(Color.White)
let i = new Bitmap(600,400)
let g = Graphics.FromImage i
let f = new Font("Courier", float32 <| 24.0)
g.FillRectangle(whiteBr, float32 <| 0.0, float32 <| 0.0, float32 <| 600.0, float32 <| 400.0 )
g.DrawString(text, f, redBr, float32 <| 10.0, float32 <| 40.0)
g.Flush()
let ms = new System.IO.MemoryStream()
i.Save(ms, ImageFormat.Png)
ms.ToArray()
let app : WebPart =
Writers.setMimeType "image/png"
>=> (Successful.ok <| draw "bibi")
Run Code Online (Sandbox Code Playgroud)
MemoryStream
如果suave允许我们直接管道到响应流,我觉得可以避免该部分.
谢谢!
你基本上这样做:
open System.IO
open Suave
open Suave.Sockets
open Suave.Sockets.Control
path "/byte-stream" >=> (fun ctx ->
let write (conn, _) = socket {
use ms = new MemoryStream()
ms.Write([| 1uy; 2uy; 3uy |], 0, 3)
ms.Seek(0L, SeekOrigin.Begin) |> ignore
// do things here
let! (_,conn) = asyncWriteLn (sprintf "Content-Length: %d\r\n" ms.Length) conn
let! conn = flush conn
do! transferStream conn ms
return conn
}
{ ctx with
response =
{ ctx.response with
status = HTTP_200.status
content = SocketTask write } }
|> succeed
)
Run Code Online (Sandbox Code Playgroud)