2017-12-28 38 views
0

アップロードされたファイルに対する操作、私は次のようにアップロードされたファイルを解析しようとしている

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 

、私はテストファイルでPOSTをしようとすると:

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

私はエラーを受け取ります:

[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 

その後の検査/tmp/plug-1514/は、実際には空のディレクトリであることがわかります。

アップロードされたファイルは短命であり、長寿命に設定できますか、ここで何かが欠けていますか?

+1

あなたは 'パスの値だけを渡してみてくださいことはできますか? – Dogbert

+0

ありがとうございました。これは、 '/ tmp/plug-1514 /'のファイルが見つからなくて、 'h File.stream!/ 1'がベースネームのファイルパスを示しています。 – category

答えて

1

pathには、アップロードされたファイルのフルパスが含まれています。 filenameは、ユーザーがブラウザで選択したファイルの名前(またはこの場合はcurl)です。アップロードされたファイルはその名前で保存されません。あなたが唯一のFile.stream!/1pathに合格する必要があります! `` File.streamへ/ 1 ':

things_params = 
    path 
    |> File.stream! 
    |> ... 
関連する問題