f# - 有没有办法将图像直接通过管道传输到温和的响应流?

标签 f# suave

我想在服务器端动态生成一个图像并将其发送到浏览器。

目前我正在使用 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")

我觉得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
)

关于f# - 有没有办法将图像直接通过管道传输到温和的响应流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37804071/

相关文章:

.net - 在文件保存时重新加载 Suave 应用程序

performance - 在运行时分配无成员类型与在运行时分配无成员类型编译时绑定(bind)

c# - 什么是 F# 尾调用?为什么它比 C# 有性能提升?

f# - 将元组数组转换为二维数组

F# - 纯功能设计而不是 oop 设计

f# - 映射 json 输入但不在 Suave 中输出

c# - 在 LINQPad 中编写 F# 查询

f# - 如何让 SignalR 与 Suave 一起工作?

f# - 在 Suave 中允许多个带有 CORS 的 header

f# - 如何使用 Suave 捕获像 "/COMPANY/rest..."这样的动态子路径并嵌套路由?