2016-11-15 28 views
0

我試圖使用hackney流多部分窗體。使用hackney流文件

這是我當前的代碼:

method = :post 
path = "https://httpbin.org/post" 
req_headers = [ 
    {"Content-Type", "multipart/form-data"} 
] 

{:ok, pid} = :hackney.request(method, path, req_headers, :stream, []) 

:hackney.send_multipart_body(pid, {:file, "/Users/gmile/.vimrc"}) 

{:ok, _status, _headers, pid} = :hackney.start_response(pid) 

{:ok, body} = :hackney.body(pid) 

在有:hackney.send_multipart_body/2行,我看得到異常:

** (ArgumentError) argument error 
    :erlang.byte_size(nil) 
    (hackney) src/hackney_multipart.erl:134: :hackney_multipart.mp_header/2 
    (hackney) src/hackney_multipart.erl:239: :hackney_multipart.mp_file_header/2 
    (hackney) src/hackney_request.erl:222: :hackney_request.stream_multipart/2 
    (hackney) src/hackney.erl:432: anonymous fn/2 in :hackney.send_multipart_body/2 
    read_and_stream.exs:13: (file) 

問:我究竟做錯了什麼?

在我的代碼中顯然有一個錯誤,但由於關於:hackney.send_multipart_body/2的文檔很少,所以我無法將這個問題包裹起來。


我開始調試了。

下面是堆棧跟蹤的執行路徑,在來電訂購:

  1. https://github.com/benoitc/hackney/blob/master/src/hackney.erl#L432
  2. https://github.com/benoitc/hackney/blob/master/src/hackney_request.erl#L222
  3. https://github.com/benoitc/hackney/blob/master/src/hackney_multipart.erl#L239
  4. https://github.com/benoitc/hackney/blob/master/src/hackney_multipart.erl#L134

如果我理解正確的話,應該有一個Boundary vari能夠在HTTP客戶端進程中設置。不過,我似乎無法理解它在哪裏設置。

+1

我認爲你需要使用':stream_multipart'作爲第四個參數(而不是':流')在調用':hackney.request/5'的時候。 – Dogbert

+0

謝謝你親切的先生。你剛剛救了我幾個小時的抓我的頭:)請張貼答案,我會接受它。 – gmile

回答

1

爲了使用:hackney.send_multipart_body/2,您的要求的身體(第四個參數)應:stream_multipart,不:stream

{:ok, pid} = :hackney.request(method, path, req_headers, :stream_multipart, [])