busboy 中的 'field' 和 'file' 事件有什么区别?

What's the difference between the 'field' and the 'file' events in busboy?

Busboy 是我用来上传文件的中间件。在 Chrome 中使用 html 表单,我可以上传文件(使用 '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' 事件的处理程序中?

According to the busboy documentation file 文件上传事件被触发:

  • Emitted for each new file form field found. transferEncoding contains the 'Content-Transfer-Encoding' value for the file stream. mimeType contains the 'Content-Type' value for the file stream.

因为你得到一个 field 事件,我的猜测是输入的发送方式与 html 文件输入元素不同:

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

我不熟悉 android API,所以不确定文件是如何发送的,但是由于您的现场事件已触发,看来您应该深入了解客户端(Android ) 的代码,看看你有什么可能性。

或者,您可以验证您的字段输入是否包含您在上述问题的代码片段中建议的文件:

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

您可以通过 debugging/analyzing/logging 您的请求对象简单地检查您从客户那里得到了什么。


如果您无法自己编写客户端代码,您也可以尝试构建一个小型 html 上传页面,您可以在其中将文件上传到您的服务器并查看您获得的结果。这样您就可以轻松检查您的服务器是否按预期工作。 在这个小应用程序中可以通过不同的方式上传文件:

  1. 通过示例中的表单 here
  2. 如示例中的二进制内容here

并测试您的服务器是否能够在这两种情况下正确处理文件。