Bdf*_*dfy 0 javascript node.js
我有一个简单的例子:
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);
})
});
};
});
Run Code Online (Sandbox Code Playgroud)
为什么"检查"返回空上传?在这种情况下我应该使用全局变量吗?
你的问题与全局变量无关 - 当在JavaScript中创建一个新变量而没有前缀时var,它是动态范围的AFAIK,这意味着它是全局的.无论如何,如果你的变量确实在函数之外被声明为不仅是全局的,而且看起来也是全局的,我会觉得更好:
var uploads = {}
server = http.createServer(function(req, res) {
if (req.url == '/check') {
// ...
Run Code Online (Sandbox Code Playgroud)
现在,让我们看看你真正的问题:你以一种非常奇怪的方式使用强大的东西.我,从来没有使用过这种on()方法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();
});
Run Code Online (Sandbox Code Playgroud)
IncomingForm.parse()将在调用回调之前处理所有文件.您将拥有所有可用文件以及它们的路径.当然,在这个例子中,我们tracker.progress只包含一堆数据 - 这将是完整的文件内容.
另请注意,您用于上传文件的表单应具有以下enctype='multipart/form-data'属性:
<form action='/upload' method='POST' enctype='multipart/form-data'>
Run Code Online (Sandbox Code Playgroud)
就是这样,希望这会有所帮助.请注意,我假设您需要解决问题; IncomingForm.on()但是,如果你想测试这个方法,这个答案就不会有用了.我希望我做出了正确的猜测:)
| 归档时间: |
|
| 查看次数: |
2329 次 |
| 最近记录: |