使用Elm从POST请求下载文件

时间:2018-08-28 09:50:02

标签: post download elm

我处于一个HTTP POST端点/render的位置,该端点返回PDF文档,并希望向用户显示一个按钮/链接,该按钮/链接将导致将此文档下载并保存到文件,而无需离开Elm应用程序。

理想情况下,POST将接受具有自定义格式的text/plain正文,但是我可以重做端点以接受multipart/form-dataapplication/x-www-form-urlencoded

我可以按如下所示将原始数据成功下载到Elm应用程序,但是我对如何将文件保存到磁盘一无所知。

import Http

render : String -> Http.Request String
render body =
  Http.request
    { method = "POST"
    , headers = []
    , url = "/render"
    , body = Http.stringBody "text/plain" body
    , expect = expectString
    , timeout = Nothing
    , withCredentials = False
    }

1 个答案:

答案 0 :(得分:2)

我是用expectBytes而不是expectString来做的 所以我的代码是

import Bytes exposing (Bytes)
import File.Download as Download

Msg = .. | FormUploaded (Result Http.Error Bytes)

Http.post
        { url = "/passports"
        , body =
            Http.multipartBody...
        , expect = Http.expectBytesResponse FormUploaded (resolve Ok)
        }


downloadPdf : Bytes -> Cmd msg
downloadPdf pdfContent =
    Download.bytes "form.pdf" "application/pdf" pdfContent

update : Msg -> Model -> ( Model, Cmd Msg )
update model =
...
    FormUploaded (Ok response) ->
            ( model, downloadPdf response )
    FormUploaded (Err err) ->
            ( model, Cmd.none )

-- this helper function copied from https://github.com/elm/http/blob/2.0.0/src/Http.elm#L514-L521
resolve : (body -> Result String a) -> Http.Response body -> Result Http.Error a
resolve toResult response =
    case response of
        BadUrl_ url ->
            Err (BadUrl url)

        Timeout_ ->
            Err Timeout

        NetworkError_ ->
            Err NetworkError

        BadStatus_ metadata _ ->
            Err (BadStatus metadata.statusCode)

        GoodStatus_ _ body ->
            Result.mapError BadBody (toResult body)

这不是理想的方法,但是有效

PS:我从Elm Slack频道https://elmlang.slack.com/

获得了帮助
相关问题