node代理下载的问题
发布于 8 年前 作者 zfeidy 4057 次浏览 来自 问答

我有一个做下载的操作,但因需求,需要先经过node做一次转发再请求到远程服务。我的代码如下:

var http = require("http");
var querystring = require("querystring");
var url = require('url');
var proxyconfig = require("../config/proxy");

exports.ajax = function (req, res) {
    var ajaxUrl = req.body.url;
    var ajaxType = req.body.type;
    var ajaxData = req.body.data || "";
    var ajaxContentType = (req.body.contentType || "application/x-www-form-urlencoded") +"; charset=utf-8";
    
    var urlObj = {
        hostname: proxyconfig.hostname,
        port: proxyconfig.port,
        path: ajaxUrl
    };
    if(ajaxUrl.indexOf("http") >= 0){
        urlObj = url.parse(ajaxUrl);
    }
    
    var options = {
        hostname: urlObj.hostname,
        port: urlObj.port,
        path: urlObj.path,
        method: ajaxType,
        headers: {
            'Content-Type': ajaxContentType,
            'Content-Length': Buffer.byteLength(ajaxData, 'utf8')
        }
    };
    
    var ajaxReq = http.request(options, function (ajaxRes) {
        ajaxRes.setEncoding('utf8');
        ajaxRes.pipe(res);
    });

    ajaxReq.on('error', function (e) {
        console.log('problem with request: ' + e.message);
        res.json({
            ok: false,
            msg: "请求数据异常!",
            extmsg: e.message
        });
    });
    
    if(ajaxData){
        ajaxReq.write(ajaxData);
    }
    ajaxReq.end();
};

但是现在的问题是,我在浏览器做了下载请求后,只能获取一个乱码的文件,而无法得到正确的文件。请问怎么处理这个问题?

5 回复

是文件名乱码还是什么乱码?

来自炫酷的 CNodeMD 越来越喜欢material design😁

@XGHeaven 第一个是文件没有名字和后缀的,比如我请求得url是/a,下载的文件默认就是a,正常的直接请求后端下载是有名字和后缀(我下载的是xls文件)的。然后我把下载的文件用excel打开,里面是乱码。换了各种版本都是乱码。

@zfeidy 你需要设置res里面的header,来指定文件名字。如果内容乱码的话,可能是编码的问题

来自炫酷的 CNodeMD 越来越喜欢material design😁

修改如下代码就可以了,好郁闷:

    var ajaxReq = http.request(options, function (ajaxRes) {
        res.writeHead(ajaxRes.statusCode, ajaxRes.headers);
        ajaxRes.pipe(res);
    });

有文件下载时,不能添加

ajaxRes.setEncoding('utf8');

同时需要把ajaxRes的headers给复制回来!

@zfeidy 我的意思就是这个意思😂

来自炫酷的 CNodeMD 越来越喜欢material design😁

回到顶部