upload chunks with offset. fail if uploaded file does not match oshash
This commit is contained in:
parent
4dca348b6e
commit
22e3a9eedd
8 changed files with 71 additions and 25 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue