代码之家  ›  专栏  ›  技术社区  ›  robx

使用elm从post请求下载文件

  •  3
  • robx  · 技术社区  · 6 年前

    我的位置是我有一个http post端点 /render 它返回一个pdf文档,并希望向用户显示一个按钮/链接,该按钮/链接将导致下载此文档并将其保存到文件中,而无需离开my elm应用程序。

    理想情况下,该职位将接受 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
        }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   user3188585    6 年前

    我是用 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 Channel的帮助 https://elmlang.slack.com/