我处于一个HTTP POST端点/render
的位置,该端点返回PDF文档,并希望向用户显示一个按钮/链接,该按钮/链接将导致将此文档下载并保存到文件,而无需离开Elm应用程序。
理想情况下,POST将接受具有自定义格式的text/plain
正文,但是我可以重做端点以接受multipart/form-data
或application/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
}
答案 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/
获得了帮助