Файл изображения post blob для отображения сервера с помощью javascript fetch [duplicate]

Вы можете сделать это с помощью numpy.eye и использовать механизм выбора элемента массива:

import numpy as np
nb_classes = 6
data = [[2, 3, 4, 0]]

def indices_to_one_hot(data, nb_classes):
    """Convert an iterable of indices to one-hot encoded labels."""
    targets = np.array(data).reshape(-1)
    return np.eye(nb_classes)[targets]

Возвращаемое значение indices_to_one_hot(nb_classes, data) теперь

array([[[ 0.,  0.,  1.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  1.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  1.,  0.],
        [ 1.,  0.,  0.,  0.,  0.,  0.]]])

.reshape(-1), чтобы убедиться, что у вас есть правильный формат ярлыков (у вас также может быть [[2], [3], [4], [0]]).

41
задан hexacyanide 10 September 2013 в 04:35
поделиться

5 ответов

Редактирование 2: Выпуск 1.15.2 модуля анализатора тела вводит режим raw mode , который возвращает тело в качестве буфера . По умолчанию он также автоматически обрабатывает дефляцию дефляции и gzip. Пример использования:

var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));

app.get(path, function(req, res) {
  // req.body is a Buffer object
});

По умолчанию объект options имеет следующие параметры по умолчанию:

var options = {
  inflate: true,
  limit: '100kb',
  type: 'application/octet-stream'
};

Если вы хотите, чтобы ваш сырой парсер разбирал другие типы MIME, кроме application/octet-stream, вам нужно будет изменить его здесь. Он также поддерживает подстановочные знаки, такие как */* или */application.


Примечание: Следующий ответ для версий до Express 4, где промежуточное программное обеспечение все еще в комплекте с каркасом. Современным эквивалентом является модуль body-parser , который должен быть установлен отдельно.

Свойство rawBody в Express было когда-то доступно, но было удалено с версии 1.5.1. Чтобы получить необработанное тело запроса, перед использованием bodyParser вы должны установить промежуточное программное обеспечение. Вы также можете прочитать обсуждение GitHub об этом здесь .

app.use(function(req, res, next) {
  req.rawBody = '';
  req.setEncoding('utf8');

  req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });

  req.on('end', function() {
    next();
  });
});
app.use(express.bodyParser());

Это промежуточное ПО будет считываться из фактического потока данных и хранить его в свойстве rawBody запроса , Затем вы можете получить доступ к необработанному телу следующим образом:

app.post('/', function(req, res) {
  // do something with req.rawBody
  // use req.body for the parsed body
});

Изменить: кажется, что этот метод и bodyParser отказываются сосуществовать, потому что один будет потреблять поток запросов перед другим, что приведет к тому, что второе никогда не стрелять end, тем самым никогда не вызывая next() и не вися на вашем приложении.

Самое простое решение, скорее всего, будет изменить источник bodyParser, который вы найдете на линии 57 анализатора JSON от Connect. Это будет измененная версия.

var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
  req.rawBody = buf;
  var first = buf.trim()[0];
  ...
});

Вы найдете файл в этом месте:

/node_modules/express/node_modules/connect/lib/middleware/json.js.

58
ответ дан hexacyanide 19 August 2018 в 19:50
поделиться
  • 1
    Кажется, мы не можем этого сделать. Если бы я добавил этот код, события в\node_modules \ express\node_modules \ connect \ lib \ middleware \ urlencoded.js не будут запущены. req.on («данные»), req.on («конец») не запускается . – haitao_wu 10 September 2013 в 07:27
  • 2
    После добавления кода я обрабатываю свой пост, используя этот код app.post (& quot; / ajax & quot ;, function (req, res) {res.send ('hello world, post');}); когда контент-тип моего запроса является приложением / x-www-form-urlencoded, сервер не будет реагировать & quot; привет мир, пост & quot; – haitao_wu 10 September 2013 в 07:34
  • 3
    расположение файла в моем случае неверно. У меня нет модуля подключения в node_modules of express (& gt; 4.0.0), который еще не нашел новое местоположение – Sam Vloeberghs 27 April 2014 в 23:59
  • 4
    Connect не является зависимостью в Express 4 и поэтому не содержит модуль Body Parser. Если вы все еще нуждаетесь в этом, вы найдете здесь . – hexacyanide 28 April 2014 в 00:31
  • 5
    @hexacyanide Можете ли вы обновить свой ответ и включить ссылку на новейшее промежуточное программное обеспечение body-parser ? Модуль теперь включает в себя промежуточное ПО raw-body-parser . Это может быть полезно для поисковиков, ищущих способ получения необработанного тела. – eAbi 6 August 2015 в 08:00

Будьте осторожны с этими другими ответами, поскольку они не будут играть правильно с bodyParser, если вы хотите также поддерживать json, urlencoded и т. д. Чтобы заставить его работать с bodyParser, вы должны заставить обработчика зарегистрироваться только на Content-Type, о котором вы заботитесь, как и сам bodyParser.

Чтобы получить исходное содержимое тела запроса с Content-Type: "text/plain" в req.rawBody, вы можете сделать:

app.use(function(req, res, next) {
  var contentType = req.headers['content-type'] || ''
    , mime = contentType.split(';')[0];

  if (mime != 'text/plain') {
    return next();
  }

  var data = '';
  req.setEncoding('utf8');
  req.on('data', function(chunk) {
    data += chunk;
  });
  req.on('end', function() {
    req.rawBody = data;
    next();
  });
});
20
ответ дан nortron 19 August 2018 в 19:50
поделиться
  • 1
    +1. Я попробовал одно из решений выше, а затем все мои GET и json-сообщения были неудачными. Вышеупомянутые решения технически правильны для вопроса, но если вы обрабатываете более разнообразные запросы с данными в нескольких формах, вам это нужно. – Houseman 11 September 2014 в 18:31
  • 2
    Что такое данные здесь? это переменная, которую мы отправляем из пользовательского интерфейса? – Saras Arya 8 October 2015 в 20:36

Это вариант ответа на гексаканид выше. Это промежуточное программное обеспечение также обрабатывает событие «данные», но не дожидается, когда данные будут потребляться, прежде чем вызывать «следующий». Таким образом, оба этих промежуточного слоя и bodyParser могут сосуществовать, потребляя поток параллельно.

app.use(function(req, res, next) {
  req.rawBody = '';
  req.setEncoding('utf8');

  req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });

  next();
});
app.use(express.bodyParser());

13
ответ дан oferei 19 August 2018 в 19:50
поделиться
  • 1
    Это, похоже, не работает на длинных телах, которые рано срезаются. – Adam Lockhart 30 September 2014 в 17:16
  • 2
    Работала отлично, спас меня. Спасибо. – hakazvaka 17 January 2016 в 09:53
  • 3
    Я подтверждаю, что это работает и для больших файлов. Я попытался отправить текстовый файл размером 1,5 МБ, и все данные были получены правильно. спасибо – ATOzTOA 30 September 2016 в 16:29
  • 4
    @AdamLockhart - какой размер были ваши запросы, которые получили разрез? – UpTheCreek 10 October 2016 в 14:44
  • 5
    @UpTheCreek, было время. Не уверен. Мои последние материалы не используют этот фрагмент, но если другие не сообщают о проблемах, это может быть ошибка, которая была исправлена. – Adam Lockhart 13 October 2016 в 16:46

Это решение сработало для меня:

var rawBodySaver = function (req, res, buf, encoding) {
  if (buf && buf.length) {
    req.rawBody = buf.toString(encoding || 'utf8');
  }
}

app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));

Когда я использую решение с req.on('data', function(chunk) { });, он не работает с куском тела запроса.

12
ответ дан Pavel Evstigneev 19 August 2018 в 19:50
поделиться
  • 1
    Это касалось всех основных сценариев входящих данных в различных частях запроса. – TWright 28 May 2016 в 06:35
  • 2
    Я пытался проверить hmac для приложения Shopify apphook, и это сработало для меня. Я грубо следовал этому примеру: gist.github.com/andjosh/5c4f0244914adfd312e4 . – Chad Johnson 18 August 2017 в 17:53

У меня есть решение, которое отлично сочетается с bodyParser, используя обратный вызов verify в bodyParser. В этом коде я использую его, чтобы получить sha1 содержимого, а также получить сырое тело.

app.use(bodyParser.json({
    verify: function(req, res, buf, encoding) {

        // sha1 content
        var hash = crypto.createHash('sha1');
        hash.update(buf);
        req.hasha = hash.digest('hex');
        console.log("hash", req.hasha);

        // get rawBody        
        req.rawBody = buf.toString();
        console.log("rawBody", req.rawBody);

    }
}));

Я новичок в Node.js и express.js (начался вчера, буквально!) поэтому я хотел бы услышать комментарии к этому решению.

30
ответ дан Tiago A. 19 August 2018 в 19:50
поделиться
  • 1
    Мне действительно нравится это решение. Я просто включил req.rawBody = buf.toString(); и взял все остальное из функции verify, потому что это было все, что мне было нужно, и оно прекрасно работало. Не нужно менять исходный код bodyParser! – Greg 29 April 2015 в 16:08
  • 2
    +1, но теперь моя проблема в том, что мне нужна функция async для проверки того, был ли этот запрос ранее отправлен или нет: / – Renato Gama 12 May 2015 в 14:29
  • 3
    очень хорошо. могу ли я предложить req.rawBody = buf.toString(encoding); – shaharsol 23 February 2016 в 21:20
  • 4
    Это будет захватывать только запросы application/json – Pavel Evstigneev 26 February 2016 в 13:33
Другие вопросы по тегам:

Похожие вопросы: