1 from functools import wraps
3 from django.core.files.uploadedfile import UploadedFile
4 from django.core.files.uploadhandler import FileUploadHandler, StopUpload, StopFutureHandlers
5 from django.views.decorators.csrf import csrf_exempt, csrf_protect
7 from filex.ftp import FTPOperation
10 class FtpUploadHandler(FileUploadHandler):
15 def new_file(self, file_name, *args, **kwargs):
16 super(FtpUploadHandler, self).new_file(file_name, *args, **kwargs)
18 # TODO limit to selected request.path
19 # TODO validate host and path
20 host = self.request.GET.get('host')
21 path = self.request.GET.get('path')
23 if self.request.user.is_anonymous() or not host or not path:
24 raise StopUpload(connection_reset=True)
27 self.ftp = FTPOperation(self.request.session['proxy'], self.chunk_size)
29 self.url = 'gsiftp://' + host + path + self.file_name
30 self.tmp_url = 'gsiftp://' + host + path + self.file_name + '.part'
32 self.ftp.put(self.tmp_url)
36 def receive_data_chunk(self, raw_data, start):
37 self.ftp.stream.put(raw_data)
39 def file_complete(self, file_size):
40 # signal end of data and wait for finish
41 self.ftp.stream.put(None)
44 self.ftp.move(self.tmp_url, self.url)
46 return UploadedFile(name=self.file_name, size=file_size, charset=self.charset,
47 content_type=self.content_type, content_type_extra=self.content_type_extra)
50 def with_ftp_upload_handler(view_func):
52 def wrapped_view(request, *args, **kwargs):
53 request.upload_handlers = [FtpUploadHandler(request)]
55 return csrf_protect(view_func)(request, *args, **kwargs)
57 return csrf_exempt(wrapped_view)