upload chunks with offset. fail if uploaded file does not match oshash

This commit is contained in:
j 2014-04-11 12:08:14 +00:00
commit 22e3a9eedd
8 changed files with 71 additions and 25 deletions

View file

@ -178,7 +178,7 @@ class Document(models.Model):
h = (7-len(h))*'0' + h
return os.path.join('documents', h[:2], h[2:4], h[4:6], h[6:], name)
def save_chunk(self, chunk, chunk_id=-1, done=False):
def save_chunk(self, chunk, offset=None, done=False):
if self.uploading:
if not self.file:
name = 'data.%s' % self.extension
@ -188,7 +188,12 @@ class Document(models.Model):
f.write(chunk.read())
self.save()
else:
with open(self.file.path, 'a') as f:
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

View file

@ -283,7 +283,7 @@ def thumbnail(request, id, size=256, page=None):
class ChunkForm(forms.Form):
chunk = forms.FileField()
chunkId = forms.IntegerField(required=False)
offset = forms.IntegerField(required=False)
done = forms.IntegerField(required=False)
@login_required_json
@ -300,13 +300,13 @@ def upload(request):
form = ChunkForm(request.POST, request.FILES)
if form.is_valid() and file.editable(request.user):
c = form.cleaned_data['chunk']
chunk_id = form.cleaned_data['chunkId']
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, chunk_id, form.cleaned_data['done']):
if not file.save_chunk(c, offset, form.cleaned_data['done']):
response['result'] = -1
if form.cleaned_data['done']:
response['done'] = 1