-from itertools import islice
import logging
import mimetypes
import os
from django.shortcuts import get_object_or_404, render
from django.template.defaultfilters import filesizeformat
from django.utils.formats import date_format
+from django.utils.http import urlquote
from django.views.decorators.http import require_POST
from django.views.generic import View
listing = ftp.listing(make_url(params, 'path'))
data = []
- # ignore . and .. from beginning of the listing
- for item in islice(listing, 2, None):
- item['size'] = filesizeformat(item['size'])
- item['date'] = date_format(item['date'], 'CUSTOM_DATETIME_FORMAT')
+ for item in listing:
+ if item['name'] not in ['.', '..']:
+ item['size'] = filesizeformat(item['size'])
+ item['date'] = date_format(item['date'], 'CUSTOM_DATETIME_FORMAT')
- data.append(item)
+ data.append(item)
return JsonResponse(data, safe=False)
mime_type, encoding = mimetypes.guess_type(name)
response = StreamingHttpResponse(data, content_type=mime_type or 'application/octet-stream')
- response['Content-Disposition'] = u'attachment; filename={}'.format(name)
+ response['Content-Disposition'] = 'attachment; filename*={}'.format(urlquote(name))
response['Content-Length'] = stats['size']
if encoding:
for path in params['dirs']:
try:
- ftp.rmdir(url + path)
+ ftp.rmdir(url + urlquote(path))
except FTPError as e:
fail[path] = e.message
else:
for path in params['files']:
try:
- ftp.delete(url + path)
+ ftp.delete(url + urlquote(path))
except FTPError as e:
fail[path] = e.message
else:
def make_url(params, *parts):
- return 'gsiftp://{}/{}'.format(params['host'], os.path.join(*[params[part] for part in parts]) if parts else '')
+ return 'gsiftp://{}/{}'.format(params['host'],
+ urlquote(os.path.join(*[params[part] for part in parts]), safe='/~') if parts else '')
@require_POST