2017-12-28 32 views
0

Ich versuche, eine hochgeladene Datei zu analysieren, wie folgt:Betrieb auf einer hochgeladenen Datei

lib/thingy_web/controllers/things_controller.ex

def create(conn, %{"data" => %Plug.Upload{content_type: "application/octet-stream", filename: basename, path: dirname}}) do 
    things_params = dirname <> "/" <> basename 
    |> File.stream! 
    |> NimbleCSV.RFC4180.parse_stream 
    |> Enum.map(&AllThings.create_things_params/1) 
    |> Enum.map(&AllThings.create_things/1) 

    conn 
    |> put_status(:created) 
    end 

Allerdings, wenn ich versuche, eine POST mit einer Testdatei:

curl -F '[email protected]/root/test' http://localhost:4000/api/thing 

Ich erhalte den Fehler:

[debug] Processing with ThingyWebWeb.ThingsController.create/2 
    Parameters: %{"data" => %Plug.Upload{content_type: "application/octet-stream", filename: "test", path: "/tmp/plug-1514/multipart-1514490176-65282591343221-1"}} 
    Pipelines: [:api] 
[info] Sent 500 in 55ms 
[error] #PID<0.544.0> running ThingyWeb.Endpoint terminated 
Server: localhost:4000 (http) 
Request: POST /api/thing 
** (exit) an exception was raised: 
    ** (File.Error) could not stream "/tmp/plug-1514/multipart-1514490176-65282591343221-1/test": not a directory 
     (elixir) lib/file/stream.ex:79: anonymous fn/2 in Enumerable.File.Stream.reduce/3 
     (elixir) lib/stream.ex:1270: anonymous fn/5 in Stream.resource/3 
     (elixir) lib/stream.ex:806: Stream.do_transform/8 

Die nachträgliche Überprüfung von /tmp/plug-1514/ zeigt, dass es sich tatsächlich um ein leeres Verzeichnis handelt.

Ist die hochgeladene Datei kurzlebig und kann so konfiguriert werden, dass sie langlebig ist, oder fehlt mir hier überhaupt etwas?

+1

Können Sie einfach den Wert von 'Pfad versuchen vorbei:' auf 'File.stream/1 '!? – Dogbert

+0

Vielen Dank, dass es getan hat - re die fehlende Datei in '/ tmp/plug-1514 /', und 'h File.stream!/1' zeigt einen Dateipfad mit einem Basisnamen, darf ich fragen, wie das funktioniert? – category

Antwort

1

path enthält den vollständigen Pfad zur hochgeladenen Datei. filename ist nur der Name der Datei, die der Benutzer im Browser ausgewählt hat (oder in diesem Fall curl); Die hochgeladene Datei wird nicht mit diesem Namen gespeichert. Sie müssen nur passieren die path-File.stream!/1:

things_params = 
    path 
    |> File.stream! 
    |> ... 
Verwandte Themen