refactor chunk upload: return offset, continue at server offset
This commit is contained in:
parent
22e3a9eedd
commit
7cd152b1d5
8 changed files with 133 additions and 161 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue