2012-06-22 99 views
1

我试图通过GET ajax调用来动态请求文件下载。我有以下的客户端代码:Node.js/Express:通过ajax下载文件

$(function() { 
    $('#submit').click(function() { 
     $.ajax({ 
      type: "GET", 
      url: "/download/" + "filename", 
      dataType: "json", 
      contentType: "application/json", 
      complete: function() { 
       console.log('Complete'); 
      }, 
      success: function() { 
       console.log('Success'); 
      }, 
      error: function() { 
       console.log('Error'); 
      } 
     }); 
    }); 
}); 

在节点服务器我也有以下行(请注意,我不知道这是否是这样做的正确方法)

app.get('/download/:filename', function(req, res) { 
    console.log(req.params); 
    res.write(fs.readFileSync(__dirname + "/../public/javascripts/main.js", 'utf8')); 
}); 

所以我想实际下载该JavaScript文件(最终动态地)。我会如何正确地做这件事?有些东西告诉我我需要指定标题/内容类型。

+0

我很确定你不能用Ajax做到这一点。更好的策略是将文件加载到iframe *和*根据@Bit Destroyer的建议设置标题。 – apsillers

+0

Per @apsillers建议,如果我没有弄错,当浏览器重定向到具有上述标题的文件时,它实际上并不从当前页面浏览,而只是打开保存文件对话框。考虑到这一点,iframe可能是多余的,但不要拿我的话来说。 (ba da dum) – jamesmillerio

+0

@坐,有趣!我必须检查一下,看看它是否可以跨浏览器使用。 – apsillers

回答

4

你应该与内容类型和配置设置返回:

Content-Type: application/octet-stream 
Content-Disposition: attachment;filename=\"main.js\" 

我相信你必须重定向到这个文件虽然。如果我没有弄错,你不能强制通过AJAX调用下载文件。

+1

对不起,接受的答案花了这么长时间。谢谢! – grep

1

您是否打算将.js文件解释并应用到下载页面?

如果是这样,您可能会最终使用write()页面,无论您如何获取它,这不会是最佳实践。请致电require.js。这是异步和动态加载脚本并在运行时应用它们的更好方法。

使用手动解决方案下载动态.js文件时遇到的一个困难是依赖关系。在.js文件依赖于另一个会导致盲js未定义的错误。

此外,在将同步包含文件转换为异步包含文件方面,还有运行时性能优化增益。

Require.js很好地解决了这些问题。

希望有所帮助。 一切顺利! Clint

+0

我其实想要下载该文件。不要将其包含在页面上,或通过浏览器重定向到文本表示。 – grep

+0

谢谢你的澄清。我很抱歉。注意XSRF安全漏洞,特别是如果JS来自除你以外的任何地方。希望有所帮助。纳什。 –