nodejs: Отправка файла REST-запросом

Отправка файла и полей с данными как REST запрос из nodejs сервера на coffeescript

По началу кажется простой задачей – на stackoverflow активно рекомендуют модуль request, он правда классный. Гнётся во все стороны.. но..

  1. На сайте есть пример как отправить файл, но не бинарный, а текстовый. И почему то если натравить запрос с таким “файлом” опять же ноде(другому серверу) он не видится как файл
  2. Гуглить любые проблемы связанные с модулем крайне затруднительно – автор решил не задумываться и дал незамысловатое название, благодаря чему гуглится все, что угодно, только не то нужно.


request
method: 'POST'
# uri: "http://some.real.endpoint/here"
uri: 'http://localhost:5000/dump'
headers:
'content-type': 'multipart/form-data; moreinfo'
multipart: [
{
'Content-Disposition': "form-data; name=\"image\"; filename=\"imagefile\""
'Content-Type': image.type
'body': fs.readFileSync(image.path)
},
{
'Content-Disposition': 'form-data; name="photoCount"'
'body': "#{photoCount}"
},
{
'Content-Disposition': 'form-data; name="configuration"'
'body': configuration
},
{
'Content-Disposition': 'form-data; name="comment"'
'body': comment
},
{
'Content-Disposition': 'form-data; name="mask"'
'body': "#{10}"
},

]
, (error, response, body) ->
console.log body
res.json
result: true

Самый простой способ проверить – послушать, что приходит с помощью netcat:

rux@ruHome:~$ nc -l 5000

POST /dump HTTP/1.1
content-type: multipart/form-data; boundary=d2b3c603-7d16-49e3-8b7f-5daf6a466e6b
host: localhost:5000
content-length: 635
Connection: keep-alive

--d2b3c603-7d16-49e3-8b7f-5daf6a466e6b
Content-Disposition: form-data; name="image"; filename="imagefile"
Content-Type: image/jpeg;

Uploaded file /tmp/997ff2e734b2929fe5f8f1a8b8a433df content here
--d2b3c603-7d16-49e3-8b7f-5daf6a466e6b
Content-Disposition: form-data; name="photoCount"

1
--d2b3c603-7d16-49e3-8b7f-5daf6a466e6b
Content-Disposition: form-data; name="configuration"

CFG_1x1
--d2b3c603-7d16-49e3-8b7f-5daf6a466e6b
Content-Disposition: form-data; name="comment"

API_TEST
--d2b3c603-7d16-49e3-8b7f-5daf6a466e6b
Content-Disposition: form-data; name="mask"

10
--d2b3c603-7d16-49e3-8b7f-5daf6a466e6b--

Часа четыре такая ерунда отняла..