I have been having some problems with downloading files from the Browser as none of the mime types have been specified in the repository I use. To make it easier to download files I have added a Zip Archive format next to the Original Format at the bottom of the file view in the Browser. This will download the file in zip format.
I also used the mime_type instead of the node.content_type for the 'format=raw' to prevent those ugly errors when trying to view a file has no mime_type defined in svn.
Do you think this could be added to the trunk?
Index: Browser.py
===================================================================
--- Browser.py (revision 1579)
+++ Browser.py (working copy)
@@ -174,7 +174,7 @@
if req.args.get('format') == 'raw':
req.send_response(200)
- req.send_header('Content-Type', node.content_type)
+ req.send_header('Content-Type', mime_type)
req.send_header('Content-Length', node.content_length)
req.send_header('Last-Modified', util.http_date(node.last_modified))
req.end_headers()
@@ -185,7 +185,27 @@
if not chunk:
break
req.write(chunk)
+ elif req.args.get('format') == 'zip':
+ req.send_header('Content-Type', 'application/zip')
+ req.send_header('Content-Disposition',
+ 'filename=%s.zip' % node.name )
+ req.end_headers()
+ try:
+ from cStringIO import StringIO
+ except ImportError:
+ from StringIO import StringIO
+ from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED
+
+ buf = StringIO()
+ zipfile = ZipFile(buf, 'w', ZIP_DEFLATED)
+ zipinfo = ZipInfo()
+ zipinfo.filename = node.name
+ zipinfo.date_time = time.gmtime(node.last_modified)[:6]
+ zipinfo.compress_type = ZIP_DEFLATED
+ zipfile.writestr(zipinfo, node.get_content().read())
+ zipfile.close()
+ req.write(buf.getvalue())
else:
# Generate HTML preview
content = util.to_utf8(node.get_content().read(DISP_MAX_FILE_SIZE),
@@ -205,6 +225,10 @@
req.hdf['file.raw_href'] = raw_href
add_link(req, 'alternate', raw_href, 'Original Format', mime_type)
+ add_link(req, 'alternate',
+ self.env.href.browser(node.path, rev=rev and node.rev, format='zip'),
+ 'Zip Archive', 'application/zip' )
+
req.display('browser.cs')
This is basically a duplicate of #238.