saa*_*adq 7 javascript download node.js koa koa-router
我正试图从Koa中的POST请求处理程序触发下载koa-router.基本上,我正在尝试做这样的事情:
app.js
const Koa = require('koa')
const router = require('./router')
const app = new Koa()
app.use(router.routes())
app.use(router.allowedMethods())
app.listen(3000)
Run Code Online (Sandbox Code Playgroud)
router.js
const fs = require('fs')
const Router = require('koa-router')
const router = new Router()
router.post('/generate', function * () {
const path = `${__dirname}/test.txt`
this.body = fs.createReadStream(path)
this.set('Content-disposition', 'attachment; filename= test.txt')
})
module.exports = router
Run Code Online (Sandbox Code Playgroud)
client.js
const { fetch } = window;
const request = {
method: 'POST',
body: JSON.stringify({ fake: 'data' })
}
// Make the POST request
fetch('/generate', request)
Run Code Online (Sandbox Code Playgroud)
但是,发送POST请求时,没有任何反应.我也没有在服务器控制台或浏览器控制台中收到任何错误.任何帮助,将不胜感激!
您可以尝试使用https://github.com/koajs/send
router.post('/generate', function * (next) {
yield send(this, 'file.txt');
});
Run Code Online (Sandbox Code Playgroud)
在客户端,您需要在通过邮件请求接收文件内容时创建并触发下载.将此代码放在请求回调中
fetch('/generate', request)
.then(res => { return res.text() })
.then(content => {
uriContent = "data:application/octet-stream," + encodeURIComponent(content);
newWindow = window.open(uriContent, 'somefile');
});
Run Code Online (Sandbox Code Playgroud)
您应该在正文中设置文件流并将 Content-disposition 发送到具有该文件名的附件。使用下面的代码
const Router = require('koa-router');
const router = new Router();
router.post('/generate', function * () {
const path = `${__dirname}/file.txt`;
this.body = fs.createReadStream(path);
this.set('Content-disposition', 'attachment; filename= file.txt');
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud)
更新:完整的工作代码:
var app = require('koa')();
var router = require('koa-router')();
const fs = require('fs');
router.post('/generate', function () {
const path = `${__dirname}/file.txt`;
this.body = fs.createReadStream(path);
this.set('Content-disposition', 'attachment; filename= file.txt');
});
app
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)
客户:
<button id="btnDownload">Download</button>
<script type="text/javascript">
const request = {
method: 'POST',
body: JSON.stringify({
fake: 'data'
})
}
document.getElementById('download').onclick = () => {
fetch('/generate', request)
.then(res => {
return res.text()
})
.then(content => {});
}
</script>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3775 次 |
| 最近记录: |