Esempio n. 1
0
    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()
Esempio n. 2
0
 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()
Esempio n. 3
0
 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
Esempio n. 4
0
 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)
Esempio n. 5
0
 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)