refactor chunk upload: return offset, continue at server offset

This commit is contained in:
j 2014-04-11 16:56:22 +00:00
commit 7cd152b1d5
8 changed files with 133 additions and 161 deletions

View file

@ -17,6 +17,7 @@ import ox
from item.models import Item
from archive.extract import resize_image
from archive.chunk import save_chunk
import managers
import utils
@ -180,29 +181,20 @@ class Document(models.Model):
def save_chunk(self, chunk, offset=None, done=False):
if self.uploading:
if not self.file:
name = 'data.%s' % self.extension
self.file.name = self.path(name)
ox.makedirs(os.path.dirname(self.file.path))
with open(self.file.path, 'w') as f:
f.write(chunk.read())
self.save()
else:
if offset == None:
offset = self.file.size
elif offset > self.file.size:
return False
with open(self.file.path, 'r+') as f:
f.seek(offset)
f.write(chunk.read())
if done:
self.uploading = False
self.get_info()
self.get_ratio()
self.oshash = ox.oshash(self.file.path)
self.save()
return True
return False
name = 'data.%s' % self.extension
name = self.path(name)
def done_cb():
if done:
self.uploading = False
self.get_info()
self.get_ratio()
self.oshash = ox.oshash(self.file.path)
self.save()
return True, self.file.size
return save_chunk(self, self.file, chunk, offset, name, done_cb)
return False, 0
def thumbnail(self, size=None, page=None):
src = self.file.path

View file

@ -13,6 +13,8 @@ from django.db.models import Sum
from item import utils
from item.models import Item
from itemlist.models import List
from archive.chunk import process_chunk
import models
def get_document_or_404_json(id):
@ -281,11 +283,6 @@ def thumbnail(request, id, size=256, page=None):
document = models.Document.get(id)
return HttpFileResponse(document.thumbnail(size, page=page))
class ChunkForm(forms.Form):
chunk = forms.FileField()
offset = forms.IntegerField(required=False)
done = forms.IntegerField(required=False)
@login_required_json
def upload(request):
if 'id' in request.GET:
@ -297,19 +294,9 @@ def upload(request):
extension = extension[-1].lower()
response = json_response(status=400, text='this request requires POST')
if 'chunk' in request.FILES:
form = ChunkForm(request.POST, request.FILES)
if form.is_valid() and file.editable(request.user):
c = form.cleaned_data['chunk']
offset = form.cleaned_data['offset']
response = {
'result': 1,
'id': file.get_id(),
'resultUrl': request.build_absolute_uri(file.get_absolute_url())
}
if not file.save_chunk(c, offset, form.cleaned_data['done']):
response['result'] = -1
if form.cleaned_data['done']:
response['done'] = 1
if file.editable(request.user):
response = process_chunk(request, file.save_chunk)
response['resultUrl'] = request.build_absolute_uri(file.get_absolute_url())
return render_to_json_response(response)
#init upload
else: