diff --git a/IPython/html/files/handlers.py b/IPython/html/files/handlers.py
index f1f38b1..9e5cbe7 100644
--- a/IPython/html/files/handlers.py
+++ b/IPython/html/files/handlers.py
@@ -24,7 +24,10 @@ class FilesHandler(IPythonHandler):
path, name = os.path.split(path)
model = cm.get_model(name, path)
-
+
+ if self.get_argument("download", False):
+ self.set_header('Content-Disposition','attachment; filename="%s"' % name)
+
if model['type'] == 'notebook':
self.set_header('Content-Type', 'application/json')
else:
@@ -32,8 +35,6 @@ class FilesHandler(IPythonHandler):
if cur_mime is not None:
self.set_header('Content-Type', cur_mime)
- self.set_header('Content-Disposition','attachment; filename="%s"' % name)
-
if model['format'] == 'base64':
b64_bytes = model['content'].encode('ascii')
self.write(base64.decodestring(b64_bytes))
diff --git a/IPython/html/static/notebook/js/menubar.js b/IPython/html/static/notebook/js/menubar.js
index e168080..c7e3595 100644
--- a/IPython/html/static/notebook/js/menubar.js
+++ b/IPython/html/static/notebook/js/menubar.js
@@ -112,7 +112,7 @@ define([
notebook_path,
notebook_name
);
- window.open(url);
+ window.open(url + '?download=1');
});
this.element.find('#print_preview').click(function () {
diff --git a/IPython/html/tests/test_files.py b/IPython/html/tests/test_files.py
index 2dbf7f0..3328212 100644
--- a/IPython/html/tests/test_files.py
+++ b/IPython/html/tests/test_files.py
@@ -98,7 +98,23 @@ class FilesTest(NotebookTestBase):
self.assertEqual(r.status_code, 200)
self.assertEqual(r.headers['content-type'], 'text/plain')
self.assertEqual(r.text, 'foobar')
+
+ def test_download(self):
+ nbdir = self.notebook_dir.name
+ base = self.base_url()
+
+ text = 'hello'
+ with open(pjoin(nbdir, 'test.txt'), 'w') as f:
+ f.write(text)
+
+ r = requests.get(url_path_join(base, 'files', 'test.txt'))
+ disposition = r.headers.get('Content-Disposition', '')
+ self.assertNotIn('attachment', disposition)
+ r = requests.get(url_path_join(base, 'files', 'test.txt') + '?download=1')
+ disposition = r.headers.get('Content-Disposition', '')
+ self.assertIn('attachment', disposition)
+ self.assertIn('filename="test.txt"', disposition)
def test_old_files_redirect(self):
"""pre-2.0 'files/' prefixed links are properly redirected"""