Django 服务 file.tar.gz 未压缩
Django serves file.tar.gz not compressed
我已经做了一些服务file.tar.gz但是当我下载它时,文件没有被压缩。
我的应用 运行 服务器上的文件有 63 438 字节:
-rw-r--r-- 1 root root 63448 Nov 5 14:13 file.tar.gz
但是当我下载它时它有 716 800 字节。
这是我的下载功能:
def download_logs(request):
""" View returning file to download """
file_path = request.GET['filepath']
original_filename = file_path.split("/")[-1]
try:
file_loaded = open(file_path, 'rb')
except IOError as err:
LOG.debug(err)
LOG.debug("File %s does not exist", file_path)
return error_view(request, "IOError", "File no longer exists.")
response = HttpResponse(file_loaded.read(), 'application/x-gzip')
file_loaded.close()
file_type, encoding = mimetypes.guess_type(original_filename)
if file_type is None:
file_type = 'application/octet-stream'
response['Content-Type'] = file_type
response['Content-Length'] = str(os.stat(file_path).st_size)
if encoding is not None:
response['Content-Encoding'] = encoding
# To inspect details for the below code, see http://greenbytes.de/tech/tc2231/
if u'WebKit' in request.META['HTTP_USER_AGENT']:
# Safari 3.0 and Chrome 2.0 accepts UTF-8 encoded string directly.
filename_header = 'filename=%s' % original_filename.encode('utf-8')
elif u'MSIE' in request.META['HTTP_USER_AGENT']:
# IE does not support internationalized filename at all.
# It can only recognize internationalized URL, so we do the trick via routing rules.
filename_header = ''
else:
# For others like Firefox, we follow RFC2231 (encoding extension in HTTP headers).
filename_header = 'filename*=UTF-8\'\'%s' % urllib.quote(original_filename.encode('utf-8'))
response['Content-Disposition'] = 'attachment; ' + filename_header
return response
我想我打开文件的方式有问题,我找不到正确的解决方案。
正如 Klaus D. 在评论中所说,这是编码问题。
当我变了
if encoding is not None:
response['Content-Encoding'] = encoding
至
response['Content-Encoding'] = 'tar'
一切正常。
如果您需要提供 tar.gz 文件,请执行此操作,
tar = tarfile.open("file_name.tar.gz", "r")
response = HttpResponse(tar, content_type='application/tar+gzip')
response['Content-Disposition'] = 'attachment; filename="file_name.tar.gz"'
return response
我已经做了一些服务file.tar.gz但是当我下载它时,文件没有被压缩。
我的应用 运行 服务器上的文件有 63 438 字节:
-rw-r--r-- 1 root root 63448 Nov 5 14:13 file.tar.gz
但是当我下载它时它有 716 800 字节。
这是我的下载功能:
def download_logs(request):
""" View returning file to download """
file_path = request.GET['filepath']
original_filename = file_path.split("/")[-1]
try:
file_loaded = open(file_path, 'rb')
except IOError as err:
LOG.debug(err)
LOG.debug("File %s does not exist", file_path)
return error_view(request, "IOError", "File no longer exists.")
response = HttpResponse(file_loaded.read(), 'application/x-gzip')
file_loaded.close()
file_type, encoding = mimetypes.guess_type(original_filename)
if file_type is None:
file_type = 'application/octet-stream'
response['Content-Type'] = file_type
response['Content-Length'] = str(os.stat(file_path).st_size)
if encoding is not None:
response['Content-Encoding'] = encoding
# To inspect details for the below code, see http://greenbytes.de/tech/tc2231/
if u'WebKit' in request.META['HTTP_USER_AGENT']:
# Safari 3.0 and Chrome 2.0 accepts UTF-8 encoded string directly.
filename_header = 'filename=%s' % original_filename.encode('utf-8')
elif u'MSIE' in request.META['HTTP_USER_AGENT']:
# IE does not support internationalized filename at all.
# It can only recognize internationalized URL, so we do the trick via routing rules.
filename_header = ''
else:
# For others like Firefox, we follow RFC2231 (encoding extension in HTTP headers).
filename_header = 'filename*=UTF-8\'\'%s' % urllib.quote(original_filename.encode('utf-8'))
response['Content-Disposition'] = 'attachment; ' + filename_header
return response
我想我打开文件的方式有问题,我找不到正确的解决方案。
正如 Klaus D. 在评论中所说,这是编码问题。
当我变了
if encoding is not None:
response['Content-Encoding'] = encoding
至
response['Content-Encoding'] = 'tar'
一切正常。
如果您需要提供 tar.gz 文件,请执行此操作,
tar = tarfile.open("file_name.tar.gz", "r")
response = HttpResponse(tar, content_type='application/tar+gzip')
response['Content-Disposition'] = 'attachment; filename="file_name.tar.gz"'
return response