2016-02-11 22 views
13

W jaki sposób można załadować plik (obraz lub program Excel) w Elm?Przesyłanie plików w Elm

Nie można znaleźć żadnych przykładów.

Odpowiedź jest w porządku, nawet jeśli używany jest kod natywny. Widziałem Data w Elm-Html, ale wygląda na to, że pliki i obiekty blob nie są obsługiwane. Jaki jest sposób obejścia tego?

Odpowiedz

18

Jestem autorem biblioteki, do której odnosi się MisterMetaphor. Jest łatwiejszy w użyciu, niż wyjaśnia. Spójrz na jak skonfigurować elm-package.json w przykładzie: https://github.com/simonh1000/file-reader/blob/master/example/elm-package.json - po prostu dodaj "native-modules": true,.

Napisałem kod blog, aby umożliwić zwolnienie kodu dla wersji 0.18 i pokazać, jak przesyłane są do np. S3 można zrobić w Elm.

+1

Muszę zadziałać, ustawiając native-modules na true, w tym pakiet elm-mimetype i dodając folder src czytnika plików do katalogów źródłowych. Po tym wszystkim wszystko było proste. – ritcoder

6

Użyj biblioteki takiej jak file-reader.

Istnieje zestaw dość wyczerpujących przykładów, można zacząć od this one.

Istnieje jednak zastrzeżenie. Ponieważ ta biblioteka używa jakiegoś natywnego kodu, nie możesz go pobrać z oficjalnego repozytorium pakietów. Musisz więc ręcznie ręcznie go zainstalować.

W tym celu napisałem this hacky elm-package install replacement. Oczekuje pliku exact-dependencies.json w katalogu głównym projektu. Możesz pobrać ten plik początkowo z katalogu elm-stuff, który tworzy elm-package podczas budowania projektu. Następnie dodać odwołanie do pakietu file-reader do pliku exact-dependencies.json jak ten:

{ 
    "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" 
} 

będzie trzeba także dodać odwołanie do file-reader do pliku 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" 
} 

Po tym, należy uruchomić the elm-package install replacement i mam nadzieję, że to zadziała.

+0

Cool. Sklonowałem repozytorium i sprawdzę to. Spróbuję przesłać formularz z obrazem i plikiem programu Excel, aby zobaczyć, jak to działa. – ritcoder

3

Inną opcją do obsługi wysyłania plików w Elm jest

  • uzyskać wartość base64 zakodowany z FileReader do swojej aplikacji Elm poprzez port.
  • Następnie wyślij zakodowaną wartość base64 na serwer (np. W treści JSON).

Samouczek można znaleźć tutaj https://www.paramander.com/blog/using-ports-to-deal-with-files-in-elm-0-17 (mówi się, że dla Wiązu 0.17, ale działa niezmieniony w Wiązach 0.18).

Wady tego rozwiązania są

  • serwer musi base64-dekodowania plików, które otrzymuje co zwiększa obciążenie serwera trochę, a
  • base64 kodowanie zwiększa ilość bajtów, które przejdzie przewód (w porównaniu do pliku/BLOBa).

Plusem:

  • ma potrzeby korzystania z pakietu z natywnego kodu.

From the Elm Http docs: "W tej chwili obsługuje tylko ciągi, ale będziemy obsługiwać obiekty typu blob i pliki, gdy otrzymamy interfejs API dla nich w Wiązach."