В чем разница между событиями 'field' и 'file' в busboy? - PullRequest
0 голосов
/ 26 августа 2018

Busboy - это промежуточное ПО, которое я использую для загрузки файла.Используя html-форму внутри Chrome, я могу загружать файлы (используя событие «file»), но когда клиент android пытается загрузить файл, он не вызывает событие «file», а вместо этого вызывает событие «field».

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

import express from 'express';
import busboy from 'connect-busboy';

const app = express();

const busUpload = (req, res)=> {
    req.busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
        saveTo = `${destination}/${filename}`;

        Log('uploading to', saveTo);
        file.pipe(fs.createWriteStream(saveTo));
        // file is saved successfully.
    });

    req.busboy.on('field', function(key, value, keyTruncated, valueTruncated) {
    //  I guess 'value' contains the file, but how do I save it? what is the name of file?
    });

    req.busboy.on('finish', function() {
        Log('upload completed');
        // res.writeHead(200, {'Connection': 'close'});
        res.json({sucess: true});
    });

    // req.pipe(req.busboy);

};

‍‍ app.use('/uploads', busboy({immediate: true}), busUpload)

‍‍‍В чем разница?Что я должен сказать разработчику Android, чтобы он изменил свой запрос?Или как сохранить файл в обработчике события 'field'?

1 Ответ

0 голосов
/ 27 августа 2018

В соответствии с документацией busboy событие file запускается при загрузке файлов:

  • Отправляется для каждого найденного нового поля формы файла.TransferEncoding содержит значение «Content-Transfer-Encoding» для файлового потока.mimeType содержит значение «Content-Type» для файлового потока.

Поскольку вы получаете событие field, я предполагаю, что входные данные отправляются не так, как в HTML-файлеэлемент ввода:

<input type="file" name="filename" accept="media/type">

Я не знаком с API-интерфейсом Android, поэтому не уверен, как отправляются файлы, но так как событие вашего поля инициируется, кажется, вам следует погрузиться в клиентскую часть (Android) кода ипосмотрите, какие у вас есть возможности.

В качестве альтернативы вы можете проверить, содержит ли поле ввода файл, подобный тому, который вы уже предложили в фрагменте кода в своем вопросе выше:

//  I guess 'value' contains the file, but how do I save it? what is the name of file?

Вы можете просто проверить, чтовы получаете от клиента, отлаживая / анализируя / регистрируя объект запроса.


Если у вас нет возможности самостоятельно работать с кодом на стороне клиента, вы также можете попробовать создать небольшую загрузку HTMLстраницу, где вы загружаете файлы на свой сервер и посмотреть, какое поведение вы получаете.Таким образом, вы сможете легко проверить, работает ли ваш сервер, как ожидалось.В этом небольшом приложении можно загружать файлы различными способами:

  1. через форму как в примере здесь
  2. в виде двоичного содержимого, как в примере здесь

И проверьте, способен ли ваш сервер правильно обрабатывать файл в обоих случаях.

...