使用FileReader在Elm中呈现本地文件

Mar*_*van 2 elm

我正在使用simonh1000的文件阅读器上传图像文件.我希望elm在拖放时显示文件的内容.

我应该能够img直接在其中渲染blob数据src,但我不知道如何让FileReader.elm输出一个src可接受的值.

[ div [ class "panel" ] <|
    [ p [] [ text "User Avatar" ]
    , div dzClass
        [ label
            [ class "custom-file-upload"]
            [ input
                [ Html.Attributes.type_ "file"
                , FileReader.onFileChange OnDrop
                , multiple False
                ]
                []
            ]
        ]
    , case model.file of
        Just nf ->
            div []
                [ span [] [ text nf.name ]
                , button [ onClick (StartUpload UserAvatar) ] [ text "Upload" ]
                , div [] [ small [] [] ]
                , img [src FileReader.parseSelectedFiles] [] -- This is what I want to do
                ]

        Nothing ->
            text "" 
Run Code Online (Sandbox Code Playgroud)

但是,编译器给了我这个错误:

The argument to function `src` is causing a mismatch.

488|                                 src FileReader.parseSelectedFiles
                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Function `src` is expecting the argument to be:

    String

But it is:

    Json.Decode.Decoder (List NativeFile)

Detected errors in 1 module.
Run Code Online (Sandbox Code Playgroud)

FileReader.elm中的所有方法似乎都具有与src属性不兼容的返回类型.是否有实用的方法来转换它?

Ale*_*Lew 5

看起来你正在尝试在你的view函数中处理所有这些.Elm Architecture的工作方式,您需要集成您viewupdate函数的行为.你想要的管道是:

  • 显示文件选择对话框(在view,你已经做过)
  • 用户选择文件(导致OnDrop消息)
  • 将文件内容解析为数据URL(调用readAsDataUrl命令)
  • 将解析后的数据URL存储在模型中,也许可以使用转换为字符串 Json.Decode.decodeValue
  • 在您的视图函数中,如果可用,请使用已解析的数据URL作为参数src.

update将需要处理初始drop(OnDrop)和成功/不成功解析内部数据的两种情况:

update msg model =
   case msg of
      OnDrop (nf :: _) -> 
         model ! [Task.attempt DataURL (FileReader.readAsDataUrl nf.blob)]
      DataURL (Ok dataUrl) ->
         { model | parsedDataUrl = Json.Decode.decodeValue Jason.Decode.string dataUrl |> Result.withDefault "error.png" }
      ...
Run Code Online (Sandbox Code Playgroud)

在您的视图中,将model.parsedDataUrl作为图像的源传递.