【问题标题】:Sending a buffer to the client to download发送缓冲区到客户端下载
【发布时间】:2015-05-13 21:21:54
【问题描述】:

我在我的 Node.js 服务器上从 Dropbox 下载了一个缓冲区。我想将该缓冲区(或将其转换为文件并发送)发送到客户端,并让它立即开始在客户端下载。我在这里错过了什么?

var client = DBoxApp.client(req.session.dbox_access_token);

client.get(req.body.id, function(status, data, metadata) {
    // WHAT DO I DO HERE?
})

这是我的角度(使用承诺)。当我 console.log(响应我得到一个包含缓冲区的对象)时。

function(id, cloud){
  return $http.post('/download/'+cloud, {id: id}).then(function(response){
    console.log(response)
  }, function(response) {
    return $q.reject(response.data);
  })
}

【问题讨论】:

    标签: node.js express dropbox-api


    【解决方案1】:

    看起来您正在使用的dbox 模块有一个stream() 选项,它可能更适合文件下载。您还应该调用metadata 来查找文件的mime 类型。例如:

    var middleware = function(req, res, next) {
        var client = DBoxApp.client(req.session.dbox_access_token);
        var file = req.body.id;
    
        client.metadata(file, function(status, reply) {
            res.setHeader('Content-disposition', 'attachment; filename=' + file);
            res.setHeader('Content-type', reply.mime_type);
            client
                .stream(file)
                .pipe(res)
                .on('error', next);
        });
    };
    

    【讨论】:

    • 谢谢!所以我从一个 http 获取请求中将这些数据返回给客户端。所以现在它是响应对象的一部分,作为客户端上的缓冲区。一旦该缓冲区返回客户端,我如何才能将该缓冲区作为文件自动下载?
    • 要让浏览器下载文件,您需要设置Content-dispositionContent-type 标头,就像我在上面的示例中所做的那样。并且它不会发生“一旦它回到客户端”,您的节点服务正在将文件从 S3 逐块流式传输到浏览器。尝试运行代码。
    • 让我用完整的客户端和服务器代码更新我的问题。它还没有完全工作,
    • 更新了我的代码,并逐字使用了你的代码。这是我在 console.log(response) ���)�1F1��KI;�B|��(�Ojr�<+�?д�l���:*av7��u ���*�1^]�T��-��9g������[L�o�F}���@~�M��-F~�U0�[ �3��B��Đ����zA�� 3�'FDh4i�K�*s↵���3�f��-`�X3���:.9�o�D���Y �� 所以根本没有下载。任何的想法?非常感谢!
    • 我现在完全不知道您要做什么。您是否尝试从 Dropbox 下载文件?如果是这样,您无法在 angular 端使用 ajax 来做到这一点(不确定如何通过向 get 端点发布帖子来获得任何东西)您能否详细说明您想要实现的目标?
    猜你喜欢
    • 2018-12-01
    • 2019-12-24
    • 1970-01-01
    • 2013-09-02
    • 2023-03-14
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多