我正在构建一个NodeJs SOAP客户端.最初,我想象服务器(即节点SOAP客户端)允许通过REST API下载文档(REST API经过身份验证).经过大量的时间在谷歌和SO上,看起来这是不可能的.
这意味着当请求文档下载时,我将不得不对文档进行SOAP调用,并通过AJAX将URL返回给REST客户端.
为了做到这一点,我需要:
这是我的问题:
如果没有,我可以使用NodeJs文件系统和Express 静态模块吗?基本上我们会修改静态模块,如下所示:
return function static(req, res, next) {
if ('GET' != req.method && 'HEAD' != req.method) return next();
var path = parse(req).pathname;
var pause = utils.pause(req);
/* My Added Code Here */
res.on('end', function(){
// delete file based on req URL
})
/* end additions */
function resume() {
next();
pause.resume();
}
function directory() {
if (!redirect) return resume();
var pathname = url.parse(req.originalUrl).pathname;
res.statusCode = 301;
res.setHeader('Location', pathname + '/');
res.end('Redirecting to ' + utils.escape(pathname) + '/');
}
function error(err) {
if (404 == err.status) return resume();
next(err);
}
send(req, path)
.maxage(options.maxAge || 0)
.root(root)
.hidden(options.hidden)
.on('error', error)
.on('directory', directory)
.pipe(res);
};
Run Code Online (Sandbox Code Playgroud)是res.on('end',...vaild?或者,我应该为指向临时文件的URL创建一些中间件吗?
Eri*_* H. 21
找到两个回答我问题的SO问题.显然我们不需要使用express.static中间件.我们只需要文件系统来下载文件:
app.get('/download', function(req, res){
var file = __dirname + '/upload-folder/dramaticpenguin.MOV';
res.download(file); // Set disposition and send it.
});
Run Code Online (Sandbox Code Playgroud)
如果我们想要流式传输然后删除,请按照:
app.get('/download', function(req, res){
var stream = fs.createReadStream('<filepath>/example.pdf', {bufferSize: 64 * 1024})
stream.pipe(res);
var had_error = false;
stream.on('error', function(err){
had_error = true;
});
stream.on('close', function(){
if (!had_error) fs.unlink('<filepath>/example.pdf');
});
Run Code Online (Sandbox Code Playgroud)
mcg*_*hix 10
如果您在2015年12月之后访问此SO页面,您可能会发现之前的解决方案无效(至少它对我不起作用).我发现了一个不同的解决方案,所以我想我会在这里为未来的读者提供.
app.get('/download', function(req, res){
res.download(pathToFile, 'fileNameForEndUser.pdf', function(err) {
if (!err) {
fs.unlink(path);
}
});
});
Run Code Online (Sandbox Code Playgroud)