Node.js - 强大的 XHR 上传

Posted

技术标签:

【中文标题】Node.js - 强大的 XHR 上传【英文标题】:Node.js - Formidable upload with XHR 【发布时间】:2011-10-16 14:19:16 【问题描述】:

我尝试实现一个简单的 XHR 上传到 Node.js(通过Formidable)。问题是,如果我设置

xhr.setRequestHeader("Content-Type", "multipart/form-data");

节点给我错误:

Error: bad content-type header, no multipart boundary

如果我将边界设置为随机字符串,则不会发生任何事情。浏览器只是挂在 POST 上并等待服务器响应。

关键是,如果我将强大的功能与常规同步 POST 一起使用,那么一切正常。

有人尝试使用Formidable 进行 XHR 上传吗?

【问题讨论】:

【参考方案1】:

我用 Formidable 尝试了几种不同的方法,但始终无法让它接受 XHR 上传。这是我最终使用 express 上传文件所做的工作。

app.post('/upload', function (req,res)
  if(req.xhr)
    var fSize = req.header('x-file-size'),
    fType = req.header('x-file-type'), 
    basename = require('path').basename, 
    fName = basename(req.header('x-file-name')), 
    ws = fs.createWriteStream('./temp/'+fName); 
    req.on('data', function(data)  
      ws.write(data);
    );

希望这会有所帮助。

【讨论】:

【参考方案2】:

我想通了。我在客户端做了一个小错误。

这是使用 Formidable 上传 XHR 的工作示例

不需要设置任何边界或特殊标题。

客户

var formData = new FormData();
var xhr = new XMLHttpRequest();

var onProgress = function(e) 
  if (e.lengthComputable) 
    var percentComplete = (e.loaded/e.total)*100;
  
;

var onReady = function(e) 
 // ready state
;

var onError = function(err) 
  // something went wrong with upload
;

formData.append('files', file);
xhr.open('post', '/up', true);
xhr.addEventListener('error', onError, false);
xhr.addEventListener('progress', onProgress, false);
xhr.send(formData);
xhr.addEventListener('readystatechange', onReady, false);

服务器

app.post('/up', function(req, res) 
  var form = new formidable.IncomingForm();
  form.uploadDir = __dirname + '/tmp';
  form.encoding = 'binary';

  form.addListener('file', function(name, file) 
    // do something with uploaded file
  );

  form.addListener('end', function() 
    res.end();
  );

  form.parse(req, function(err, fields, files) 
    if (err) 
      console.log(err);
    
  );
);

【讨论】:

我收到错误“错误的内容类型标头,没有内容类型”。不确定如何解决这个问题? @pagewil 尝试在
标签上设置 enctype="multipart/form-data"
您能分享一下客户端的实际问题是什么,解决了吗? 太棒了!它有助于。谢谢!你发现为什么不能指定header类型了吗? @BrickYang 你不应该添加 Content-Type,因为如果你这样做,你应该包括像这样的边界分隔符“multipart/form-data;boundary=----WebKitFormBoundarydxvCgHrARZTMcsKt”,而你 *cannot* 实际上在 FormData 访问边界分隔符。 (而且我应该更仔细地阅读答案,因为我花了几个小时来了解发生了什么,而我的正确答案就在我眼前)

以上是关于Node.js - 强大的 XHR 上传的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ios 应用程序将图像上传到 Node.JS 服务器

Node.js - 在另一个方法完全执行后调用一个方法

基于Node.js的强大爬虫 能直接发布抓取的文章哦

node.js - 安全的图像文件上传

在 Backand 如何从 node.js 操作上传文件?

node.js上传下载pdf文件