gpt4 book ai didi

f# - 使用 Suave 发送具有正确名称的 (zip) 文件

转载 作者:行者123 更新时间:2023-12-02 10:54:05 25 4
gpt4 key购买 nike

我一直在研究使用 Suave 创建一个 Web 服务器。目前,我正在尝试让它在 GET 请求中发送 zip 文件。我已成功使我的应用程序发送文件,但在 Postman 中执行请求时收到的文件名称是“response”或“response.html”,具体取决于 Suave 的 Files 模块中的函数我用。也就是说,当我手动将文件重命名为 .zip 时,我可以像正常的 .zip 文件一样打开并解压缩它,这意味着问题实际上是下载文件的名称。下面的代码是我现在得到的。

open JSON
open System
open System.Threading
open Suave
open Suave.Filters
open Suave.Operators
open Suave.Successful
open Suave.Web
open System.IO
open Suave.Writers

let sampleJsonPath = @"C:\VS Projects\Research\Sample.json"
let sampleZipPath = @"C:\VS Projects\Research\Sample.zip"
let getJson() =
File.ReadAllText(sampleJsonPath)

[<EntryPoint>]
let main argv =
let cts = new CancellationTokenSource()
let mimeTypes =
defaultMimeTypesMap
@@ (function | ".zip" -> createMimeType "compression/zip" false | _ -> None)

let config =
{ defaultConfig with
mimeTypesMap = mimeTypes
cancellationToken = cts.Token
}

let app =
choose
[ GET >=> choose
[ path "/hello" >=> OK "Hello GET"
path "/jsonString" >=> OK (getJson())
path "/jsonFile" >=> warbler (fun _ -> getJson() |> JSON)// for only on startup: ... >=> (getJson() |> JSON)
path "/zip" >=> Files.sendFile sampleZipPath false
path "/goodbye" >=> OK "Goodbye GET" ]
POST >=> choose
[ path "/hello" >=> OK "Hello POST"
pathScan "/content/%d" (fun param -> OK (sprintf "Found integer:\n%d" param))
pathScan "/content/%s" (fun param -> OK (sprintf "Found content:\n%s" param))
path "/goodbye">=> OK "Goodbye POST" ]
RequestErrors.BAD_REQUEST "Unknown request encountered"
]
let listening, server = startWebServerAsync config app

Async.Start(server, cts.Token)
printfn "Ready to receive requests"
Console.ReadKey true |> ignore

cts.Cancel()

0 // return an integer exit code

到目前为止,谷歌搜索没有找到我可以使用的东西。我还尝试了 Suave 的 Files 模块中的许多其他功能,包括 Files.browseFile exampleZipPath "Sample.zip" (它还提供了一个名为“response.html”的文件") 和 Files.file exampleZipPath (给出文件名“response”),但到目前为止还没有成功。

如何提供要发送的文件的名称?

最佳答案

文件名是通过 HTTP 响应 header “Content-Disposition”设置的,Suave 不会自动处理:

   let setFileName name =
setHeader "Content-Disposition" (sprintf "inline; filename=\"%s\"" name)

所以,代码如下

path "/zip" >=> setFileName "Sample.zip"
>=> Files.sendFile sampleZipPath false

根据所需的行为,您可以将 inline; 部分替换为 attachment; 以在浏览器中显示“保存文件”对话框

关于f# - 使用 Suave 发送具有正确名称的 (zip) 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47913585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com