2017-12-20 2 views
3

私はSuaveを使用してWebサーバーを作成することを研究しています。現在、GETリクエストでzipファイルを送信しようとしています。私はアプリケーションからファイルを送信することに成功しましたが、SumanのFilesモジュールの機能に応じて、Postmanでリクエストを行うときに受け取るファイルの名前は "response"または "response.html"です。つまり、手動でファイル名を.zipに変更すると、通常の.zipファイルのようにファイルを開いて解凍できます。つまり、実際にダウンロードされたファイル名が問題です。以下のコードは私が今持っているものです。正しい名前のSuaveで(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検索ではこれまでに何も使用できませんでした。私はまた、Files.browseFile sampleZipPath "Sample.zip"(これも "response.html"という名前のファイル)とFiles.file sampleZipPath(ファイル名が "応答")を含むSuaveのFilesモジュールの他の多くの機能を試してみましたが、

送信するファイルの名前を指定するにはどうすればよいですか?

+2

これはPostmanの問題です。 https://github.com/postmanlabs/postman-app-support/issues/2082 – rmunn

答えて

4

ファイル名は、HTTPレスポンスヘッダの「Content-処分」に設定されていると自動的にサーブによって処理されていません。

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

ので、コードはあなたbehaviur希望に応じて、

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

ようになります​​の部分をattachment;に置き換えて、ブラウザに「ファイルを保存」ダイアログを表示することができます。

+0

ブラウザからの 'attachment;'の使用(興味深いことに、私の最初の試みではありません)。 Postmanを使用しても "response.html"が返されます。これが郵便配達の奇抜なのかどうか知っていますか? – JvS

+0

さて、私はちょうど私の質問の下でPostmanのバグについてのコメントを言う。 – JvS

関連する問題