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开发人员更改其请求?或者如何将文件保存在“字段”事件的处理程序中?
答案 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上传页面,在该页面中将文件上传到服务器,然后查看行为。这样,您将可以轻松检查服务器是否按预期工作。 在这个小型应用程序中,可以通过不同的方式上传文件:
并在两种情况下测试服务器是否能够正确处理文件。