5

所以大约一个月前,我问了一个关于超级代理和发送文件的问题,但根本没有得到任何回应。我仍然想知道如何做到这一点,因为我喜欢使用 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

4 回答 4

12

附加应该工作。
使用 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();
 });
于 2016-10-08T23:07:13.553 回答
6

这应该有效。

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);
    })
于 2015-08-05T13:53:03.333 回答
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)
}

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

于 2020-06-04T15:58:25.423 回答
0

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

据它说:

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

此外,即使这里不是这种情况,也有许多帖子/问题中人们使用文件名作为.attach. 再次来自此文档页面:

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

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

于 2020-08-10T23:35:34.253 回答