def complete_upload(self): temp_storage = get_temp_storage() storage = get_storage() upload = self.upload hasher = sha256() size = 0 with TemporaryFile() as temp_f: for chunk in count(1): path = get_chunk_path(upload, chunk) if not temp_storage.exists(path): break with temp_storage.open(path, 'rb') as chunk_f: for block in iter(lambda: chunk_f.read(1024 * 1024), b''): size += len(block) temp_f.write(block) hasher.update(block) temp_f.seek(0) if size == upload.size: storage.save(upload.storage_path, temp_f) upload.sha256 = hasher.hexdigest() upload.completed = timezone.now() upload.save() self.delete_upload_chunks()
def test_upload_replacement_chunk(self): get_temp_storage().save(get_chunk_path(self.upload, 1), BytesIO(b'\x00\x00\x00\x00' * 255)) c = Client() r = c.post('/events/test/upload/slides?' + self.args, {'file': BytesIO(b'\xde\xad\xbe\xef' * 256)}) self.assertEqual(r.status_code, 201) self.complete()
def delete_upload_chunks(self): temp_storage = get_temp_storage() for chunk in count(1): path = get_chunk_path(self.upload, chunk) if temp_storage.exists(path): temp_storage.delete(path) else: break
def test_get_existant_too_small(self): get_temp_storage().save(get_chunk_path(self.upload, 1), BytesIO(b'\xde\xad\xbe\xef' * 255)) c = Client() r = c.get('/events/test/upload/slides?' + self.args) self.assertEqual(r.status_code, 204)
def get_req_chunk_path(self, r_req): if r_req.total_size != self.upload.size: raise PermissionDenied("Size mismatch") if max(r_req.chunk_number, r_req.total_chunks) > 9999: raise PermissionDenied("Chunks are too small") return get_chunk_path(self.upload, r_req.chunk_number)