我有一个简单的例子:
server = http.createServer(function(req, res) {
uploads = {}
if (req.url == '/check') {
res.writeHead(200, {'content-type': 'text/plain'});
res.write(JSON.stringify(uploads));
res.end();
}
if (req.url == '/upload') {
var form = new formidable.IncomingForm();
form.on('fileBegin', function(field, file) {
var tracker = {file: file, progress: [], ended: false};
uploads[file.filename] = tracker;
file.on('progress', function(bytesReceived) {
tracker.progress.push(bytesReceived);
})
});
};
});
为什么“检查”返回空上传?在这种情况下我应该使用全局变量吗?
答案 0 :(得分:5)
你的问题与全局变量无关 - 当在JavaScript中创建一个新变量而没有var
作为前缀时,它是动态范围的AFAIK,这意味着它是全局的。无论如何,如果你的变量确实在函数之外声明,不仅是全局,而且看起来全局,我会觉得更好:
var uploads = {}
server = http.createServer(function(req, res) {
if (req.url == '/check') {
// ...
现在,让我们看看你的真正的问题:你以一种非常奇怪的方式使用强大的。例如,我从未使用on()
的{{1}}方法。我建议你使用formidable.IncomingForm
方法,它为你提供了一个键值对象,其中键是parse()
字段的名称,值是上传文件数据,例如路径服务器中的文件:
<input type="file">
在调用回调之前, if (req.url == '/upload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
for (var filename in files) {
var file = files[filename];
var tracker = {filename: filename, progress:[], ended:false};
fs.readFile(file.path, function(err, filecontent) {
tracker.progress.push(filecontent);
tracker.ended = true;
});
uploads[filename] = tracker;
}
res.writeHead(200, {'content-type': 'text/html'});
res.write("<A href='/'>ok</a>");
res.end();
});
将处理所有文件。您将拥有所有可用文件以及它们的路径。当然,在此示例中,我们的IncomingForm.parse()
将只包含一组数据 - 这将是完整的文件内容。
另请注意,您用于上传文件的表单应具有tracker.progress
属性:
enctype='multipart/form-data'
就是这样,希望这会有所帮助。请注意,我假设您需要解决问题;但是,如果你想测试<form action='/upload' method='POST' enctype='multipart/form-data'>
方法,那么这个答案就不会有用了。我希望我做出了正确的猜测:)
答案 1 :(得分:-1)
upload
在每个请求上都设置为空对象({}
),它始终为{}
。
请注意,所有请求都会调用该函数
全局变量在node.js中具有特殊含义,因为所有模块都具有本地范围。 解决方案是在函数之外声明它。
喜欢这个。
var uploads = {};
var server = http.createServer(function(req, res) {
....
我希望这会有所帮助