我一直在研究使用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
到目前为止,Google搜索还没有发现任何我可以使用的内容。我还尝试了Suave的Files
模块中的许多其他函数,包括Files.browseFile sampleZipPath "Sample.zip"
(也提供名为“response.html”的文件)和Files.file sampleZipPath
(提供文件名) “回应”),但到目前为止没有成功。
如何提供要发送的文件名?
答案 0 :(得分:4)
使用HTTP响应标头“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;
,以在浏览器中显示“保存文件”对话框