如何用superagent发送文件

时间:2015-07-31 14:41:09

标签: ajax multipartform-data form-data superagent

大约一个月前,我问过a question有关超级和发送文件的问题,但根本没有得到任何答复。我仍然想知道如何使用superagent这样做。

我可以使用普通的ajax发送文件:

var fd = new FormData();
        fd.append( 'file', this.refs.File.getDOMNode().files[0] );

        $.ajax({
            url: 'http://localhost:8080/files',
            data: fd,
            processData: false,
            contentType: false,
            type: 'POST',
            success: function(data){
                console.log(data)
            }
        });

但是当我在superagent中尝试同样的事情时,没有任何作用:

var fd = new FormData();
fd.append( 'file', this.refs.File.getDOMNode().files[0] );

Request.post('http://localhost:8080/files')
    .set('Content-Type', false)
    .set('Process-Data', false)
    .attach('file', fd, 'file')
    .end((err, res) => {
        console.log(err);
        console.log(res);
    })

请有人,请告诉我发生了什么。

4 个答案:

答案 0 :(得分:10)

附件应该工作。
使用express / multer的例子:

<强>客户端:

superagent.post('http://localhost:3700/upload').attach('theFile',file);

服务器

 const storage = multer.memoryStorage();
 const upload = multer({ storage: storage });
 router.post("/upload", upload.single('theFile'), (req, res) => {
   debug(req.file.buffer);
   res.status(200).send( true );
   res.end();
 });

答案 1 :(得分:5)

这应该有效。

var file = this.refs.File.getDOMNode().files[0];


Request.post('http://localhost:8080/files')
    .set("Content-Type", "application/octet-stream")
    .send(file)
    .end((err, res) => {
        console.log(err);
        console.log(res);
    })

答案 2 :(得分:0)

没有人问,但是我认为这可能会使一些人受益。

使用异步/等待

describe('My App - Upload Module', function(){
  it('Upload Module - ERROR - upload an expired file', async function(){
    try{
      let res = await _upload_license_file("/tmp/test_license.xml");
    }catch(err){
      err.should.have.status(422);
    }
  });
});

async function _upload_license_file(fileLocation){
  return superAgent.post(base_url + "/upload")
          .set('Authorization', 'Bearer '+API_TOKEN)
          .set('Content-Type', 'multipart/form-data')
          .attach('xml_file', fileLocation)
}

我在这里使用了错误模块,对于合格案例,您可以以类似的方式处理响应对象。

答案 3 :(得分:0)

要完成先前的答案并提供参考,请检查以下页面: https://visionmedia.github.io/superagent/#multipart-requests

据此:

使用.field()或.attach()时,不能使用.send(),并且不得设置Content-Type(将为您设置正确的类型)。

即使在这里不是这种情况,在许多帖子/问题中,人们还是使用文件名作为.attach的第二个参数。再次从此文档页面:

在浏览器中,创建具有适当类型的Blob。

这不是指第二个参数,而是第三个“选项”,但对我而言,这意味着浏览器版本不支持文件名。