后端是node的,代码,前端web咋通过ajax跨域下载文件到本地呢?求详细讲解。
下载文件为什么需要用ajax?
- 前端的话,直接响应链接就会触发下载了呗。
- 后端的话,没试过,估计也就跟爬虫爬图片一样,保存起来就可以了吧?
@514366607 我的文件在另外的服务器,web端不用ajax请求怎么请求?
@think2011 触发是没问题的,咋个获取到node那边响应回来的数据,我用ajax没有取到。
@shinygang
你理解错了,前端没有那么大的权限。
如果这是在烧烤的话,前端能做的只是一个叉子的作用,客人(用户)
通过 叉子(前端)
从 食物小车(后端)
上叉了内容,叉子并不能决定要什么食物,是由客人决定的。
js不能读写文件本地文件的。不然的话,随便上个网,电脑里就全是病毒了
<a href=“url”></a> 服务器端路由只要是二进制MIME,就下载了,不需要ajax,下载本身并不刷新页面
没明白需求,呵呵,如果非要使用ajax跨域取文件的话,可以试一下让对方服务器在HTTP报文头加上Access-Control-Allow-Origin。
@jinphen 这个我用了,那边返回了内容,ajax这边没法生成文件
@tulayang 没有直接给url的
@shinygang 你要生成文件保存到电脑上么?
ajax 本身也是通过URL请求的 你没URL怎么请求的?
@jinphen 是的,我获取到文件内容了,不知道js咋个保存成文件,要兼容。
@NexusLee 我url是动态生成的,而且这个url不是文件路径,是要通过node服务器那边处理获取文件内容的。我现在的问题是内容获取到了,咋个通过js转换成我想要的文件,并且兼容性好。
@shinygang 后来解决了么 我今天也遇到了
楼主,解决了的话,麻烦回复一下,说一下解决方案。
如果是node那边的文件内容,视为下载不就行了,另外打开窗口。利用node的流和pipe完全可以生成动态内容的问题,本身http也可以设置下载保存的文件名
服务端处理:
function returnOutput(req, res, output, callback) {
res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'});
var data = JSON.stringify({"result": output});
if (callback) {
data = callback + "(" + data + ")";
}
res.write(data);
res.end();
QueueManager.removeObj(req.uniqueUrl);
console.timeEnd(req.uniqueUrl);
}
/*下载商城折扣配置*/
app.post("/gm/downPropReduction",function(req,res){
var path = QSetting.current().pathName +'/prop_setting.js';
console.log(path);
fs.exists(path, function (exists) {
if (!exists) {
returnErrorMessage(req, res, "This request URL was not found on this server.");
} else {
fs.readFile(path,{"encoding":"utf-8"}, function (err, file) {
if (err) {
returnErrorMessage(req, res, err);
} else {
returnOutput(req, res, file);
}
});
}
});
});