busboy中的“字段”事件和“文件”事件有什么区别?

时间:2018-08-26 09:57:55

标签: node.js forms file-upload 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开发人员更改其请求?或者如何将文件保存在“字段”事件的处理程序中?

1 个答案:

答案 0 :(得分:1)

According to the busboy documentation file事件是为文件上传触发的:

  
      
  • 为找到的每个新文件表单字段发射。 transferEncoding包含文件流的“ Content-Transfer-Encoding”值。 mimeType包含文件流的“ Content-Type”值。
  •   

由于收到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?

您可以通过调试/分析/记录请求对象来简单地检查从客户端获得的信息。


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

  1. 通过示例here
  2. 中的表单
  3. 作为示例here
  4. 中的二进制内容

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