【问题标题】:What's the difference between the 'field' and the 'file' events in busboy?busboy 中的“字段”和“文件”事件有什么区别?
【发布时间】:2019-02-01 03:41:34
【问题描述】:

Busboy 是我用来上传文件的中间件。在 Chrome 中使用 html 表单,我可以上传文件(使用 'file' 事件),但是当 android 客户端尝试上传文件时,它不会触发 'file' 事件,而是触发 'field' 事件。

这里是我在服务器端使用的代码 sn-p:

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 开发人员更改他的请求吗?或者如何将文件保存在“字段”事件的处理程序中?

【问题讨论】:

    标签: node.js forms file-upload busboy


    【解决方案1】:

    According to the busboy documentationfile事件触发文件上传:

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

    由于您收到field 事件,我的猜测是输入的发送方式与在 html 文件输入元素中的发送方式不同:

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

    我不熟悉 android API,所以不确定文件是如何发送的,但由于您的字段事件被触发,因此您似乎应该深入代码的客户端 (Android),看看您有什么可能性。

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

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

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


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

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

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

    【讨论】:

    • 谢谢。我确实记录了value,它似乎是文件的缓冲区,我认为我无法从中获取文件名。使用formidable而不是busboy,并使用console.log({fields, files})我可以理解,当我从浏览器上传时,files中有一个密钥filename(如&lt;input name="filename")但是当我从android上传时,密钥不在files 中,但在fields 中,所以我猜android 在input 字段中发送没有type="file" 的文件。就像它是一个二进制文件,包含在 text 字段中。看来这就是 busboy 找不到文件的原因。
    • 您可能可以从请求标头之一获取文件名。记录你的req.headers 对象并检查你得到了什么。可能你会有一个content-disposition 标题,你可以从中读取文件名。
    • 还请与您的 Android 开发人员核实他/她是否遵循文件上传的最佳做法。可能是您在服务器上出现这种意外行为,因为 Android 客户端上的代码未遵循协议。
    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2021-04-03
    • 2014-03-12
    • 2011-02-11
    • 2013-03-04
    相关资源
    最近更新 更多