У меня проблема, когда пользователь отправляет данные изображения, он сохраняется на сервере поврежденным.Байты полезной нагрузки, отличные от фактических байтов
Итак, я в основном имею эту установку:
- 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
Это действительно работает, файлы сохраняются. Просто он спасен коррумпированным. –
Где определен 'payload'? – mscdex
ok, получил его путь [1] =, path [2] = pic ... переменная полезной нагрузки (2) в req.on ("data): в какой области она имеет? Как она инициализируется? состояние (после любого запроса)? –
xerx593