Загрузка файла в Elm

Как загрузить файл (изображение или Excel) в Elm?

Кажется, не найти примеров.

Ответ хорошо, даже если используется собственный код. Видели Data в Elm-Html но, похоже, файлы и капли не поддерживаются. Каким образом это происходит?

Ответ 1

Я автор библиотеки, на которую ссылается МистерМетафор. Это проще в использовании, чем объясняет он. Посмотрите, как я установил elm-package.json в примере: https://github.com/simonh1000/file-reader/blob/master/example/elm-package.json - просто добавьте "native-modules": true,

Я написал блог, чтобы поддержать выпуск кода для 0.18 и показать, как можно загружать, например, S3 в Elm.

Ответ 2

Используйте библиотеку, такую как файловый читатель.

Существует множество довольно полных примеров, вы можете начать с этого.

Однако есть предостережение. Поскольку в этой библиотеке используется собственный код, вы не можете получить его из официального пакета repo. Поэтому вам придется прибегать к ручной установке.

Для этой цели я написал эту замену для установки hacky elm-package. Он ожидает файл exact-dependencies.json в корневом каталоге вашего проекта. Вы можете получить этот файл из elm-stuff, elm-package при создании вашего проекта. Затем вы добавляете ссылку на пакет file-reader файл exact-dependencies.json следующим образом:

{
    "evancz/elm-effects": "2.0.1",
    "evancz/virtual-dom": "2.1.0",
    "evancz/elm-http": "3.0.0",
    "evancz/start-app": "2.0.2",
    "evancz/elm-html": "4.0.2",
    "elm-lang/core": "3.0.0",
    "simonh1000/file-reader": "1.0.0"
}

Вам также необходимо добавить ссылку на file-reader в ваш файл elm-package.json:

{
    "version": "1.0.0",
    "summary": "helpful summary of your project, less than 80 characters",
    "repository": "https://github.com/user/project.git",
    "license": "BSD3",
    "source-directories": [
        "."
    ],
    "exposed-modules": [],
    "dependencies": {
        "elm-lang/core": "3.0.0 <= v < 4.0.0",
        "evancz/elm-effects": "2.0.1 <= v < 3.0.0",
        "evancz/elm-html": "4.0.2 <= v < 5.0.0",
        "evancz/elm-http": "3.0.0 <= v < 4.0.0",
        "evancz/start-app": "2.0.2 <= v < 3.0.0",
        "simonh1000/file-reader": "1.0.0 <= v < 2.0.0",
    },
    "elm-version": "0.16.0 <= v < 0.17.0"
}

После этого вы запустите замену установки elm-пакета и, надеюсь, она будет работать.

Ответ 3

Другой вариант обработки загрузки файлов в Elm - это

  • получить base64-кодированное значение из FileReader в ваше приложение Elm через порт.
  • Затем отправьте это base64-кодированное значение на ваш сервер (например, в теле JSON).

Учебник можно найти здесь https://www.paramander.com/blog/using-ports-to-deal-with-files-in-elm-0-17 (он говорит об этом для Elm 0.17, но он работает без изменений в Вяз 0.18).

Недостатки этого подхода

  • ваш сервер нуждается в base64-декодировании файлов, которые он получает, что немного увеличивает нагрузку на сервер, и
  • base64-encoding увеличивает количество байтов, которое будет проходить по проводу (по сравнению с файлом/блобом).

Потенциал роста:

  • нет необходимости использовать пакет с собственным кодом.

Из документов Elm Http: "Сейчас он поддерживает только строки, но мы будем поддерживать blobs и файлы, когда мы получим API для них в Elm".

Ответ 4

Официальный способ сделать это теперь https://package.elm-lang.org/packages/elm/file/latest/

Это дополнение, которое появилось в Elm 0.19.

Теперь официальный пакет Http также поддерживает его. Вот пример из https://package.elm-lang.org/packages/elm/http/latest/Http#request

import File
import Http

type Msg = Uploaded (Result Http.Error ())

upload : File.File -> Cmd Msg
upload file =
  Http.request
    { method = "PUT"
    , headers = []
    , url = "https://example.com/publish"
    , body = Http.fileBody file
    , expect = Http.expectWhatever Uploaded
    , timeout = Nothing
    , tracker = Nothing
    }