怎么通过ajax下载文件,牵涉跨域
发布于 10 年前 作者 shinygang 20508 次浏览 最后一次编辑是 8 年前 来自 问答

后端是node的,代码,前端web咋通过ajax跨域下载文件到本地呢?求详细讲解。

19 回复

下载文件为什么需要用ajax?

  1. 前端的话,直接响应链接就会触发下载了呗。
  2. 后端的话,没试过,估计也就跟爬虫爬图片一样,保存起来就可以了吧?

@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也可以设置下载保存的文件名

@akayzhang @beilunyang

服务端处理:

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);
                }
            });
        }
    });
});
回到顶部