大约一个月前,我问过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);
})
请有人,请告诉我发生了什么。
答案 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。
这不是指第二个参数,而是第三个“选项”,但对我而言,这意味着浏览器版本不支持文件名。