2015-04-05 3 views
1

У меня проблема, когда пользователь отправляет данные изображения, он сохраняется на сервере поврежденным.Байты полезной нагрузки, отличные от фактических байтов

Итак, я в основном имею эту установку:

- api 
    . index.js 
    - methods 
    . users.js 

(я вырезал файлы, которые не имеют никакого отношения к проблеме)

Вне файл API, есть server.js, который initaites его всякий раз, когда отображается api.example.com. (По сути, как VirtualHost)


Это, как говорится. Вот проблема:

./api/index.js (Точки проблемы)

// All this essentiall does is get the get the whole payload as a buffer. 
req.on("data", function(chunk){ 
    // Potential problem area. 
    req.api.payload = ((req.api.payload) ? (Buffer.concat([req.api.payload, chunk])) : (chunk)); 
}); 
req.on("end", function(){ 
    // Check if we're on api.example.com/users/ 
    if (path[0].match(/^users$/i)) { 
    methods.users(req, res); 
    } 
}); 

Я думаю, что проблема где-то, когда полезная нагрузка.

Но ... Просто упаковывают, я буду включать ./api/methods/users.js ... (Только в том числе части, где могут возникнуть проблемы, так как это большой файл)

./api/methods/users.js

else if (req.method.match(/^POST$/i)) { 

    if (!path[2] || path[2].match(/^(?:info|data)$/i)) { 
    // ... (Everything that was here didn't apply to the image upload) 
    } else if (path[2].match(/^(?:pic|picture|avatar)$/i)) { 
    // Url matches api.example.com/users/<user_id>/pic 

    var __base = "/home/user/web/hosts/resources/static/images/api/users/"; // Upload path 

    // Another potential spot where the problem could be. 
    fs.writeFile(__base + path[1] + ".png", req.api.payload, "binary", function(err){ 
     if (err) res.api.end(err); 
     res.api.end(req.api.payload.slice(0, 40)); // Testing 
    }); 
    } 

} 

Обратите внимание, что это просто для тестирования загрузки, я понимаю, что кто-то может загружать другие данные, но это локально. Это просто для тестирования загруженных данных.

Еще одно замечание, любая переменная, которую вы не видите явно определяется не связана с проблемой, просто нет, что:

  • path: URL в виде массива, например, "/user/xero/info" ->["user", "xero", "info"]
  • req.api: Объект, созданный до руки (в основном файл server.js).

Еще одно замечание, я загрузить файл с помощью завиток команды:

curl -X POST -d @random.png http://api.poweredrails.org/users/test4/pic 
+1

Это действительно работает, файлы сохраняются. Просто он спасен коррумпированным. –

+1

Где определен 'payload'? – mscdex

+0

ok, получил его путь [1] = , path [2] = pic ... переменная полезной нагрузки (2) в req.on ("data): в какой области она имеет? Как она инициализируется? состояние (после любого запроса)? – xerx593

ответ

2

Проблема с вашим curl использования, необходимо указать --data-binary вместо просто -d. Вы также должны установить Content-Type заголовок так, что ротор будет делать правильные вещи:

 
curl -X POST -H "Content-Type: image/png" --data-binary @random.png http://api.poweredrails.org/users/test4/pic 

Другим вариантом заключается в поддержке использования многоэлементных/form-данных в вашем бэкэнде приложении, особенно, если хочет, чтобы представить другую информацию с образ. Тогда ваше скручивание будет выглядеть так:

 
curl -X POST --form "[email protected]" --form "foo=bar" http://api.poweredrails.org/users/test4/pic 
+0

Это сделало. Благодарю. –

Смежные вопросы