首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用名称正确的Suave发送(zip)文件

用名称正确的Suave发送(zip)文件
EN

Stack Overflow用户
提问于 2017-12-20 20:03:27
回答 1查看 167关注 0票数 3

我一直在研究使用Suave创建一个web服务器。目前,我正试图让它在一个get请求中发送一个zip文件。我已经成功地让我的应用程序发送了一个文件,但是在Postman中执行请求时收到的文件名是"response“或"response.html",这取决于我使用的Suave的Files模块中的哪个函数。这就是说,当我手动将文件重命名为.zip时,我可以像普通的.zip文件一样打开和解压缩它,这意味着真正的问题是下载的文件的名称。下面的代码是我现在得到的。

代码语言:javascript
复制
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 sampleZipPath "Sample.zip" (也提供了一个名为“response.html”的文件)和Files.file sampleZipPath (它给出了一个文件名为"response"),但到目前为止没有成功。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 09:57:05

文件名是用HTTP响应头“内容处理”设置的,Suave不会自动处理:

代码语言:javascript
复制
   let setFileName name =
     setHeader  "Content-Disposition" (sprintf "inline; filename=\"%s\"" name)

所以,代码将是

代码语言:javascript
复制
path "/zip" >=> setFileName "Sample.zip"
            >=> Files.sendFile sampleZipPath false

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47913585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档