1
1
import os
2
2
import uuid
3
-
4
3
from office365 .runtime .client_result import ClientResult
4
+ from office365 .sharepoint .actions .create_file import CreateFileQuery
5
5
from office365 .sharepoint .files .file import File
6
6
from office365 .sharepoint .files .file_creation_information import FileCreationInformation
7
- from office365 .sharepoint .actions .create_file import CreateFileQuery
8
7
9
8
10
9
def read_in_chunks (file_object , size = 1024 ):
@@ -25,56 +24,54 @@ def _create_empty_file(path):
25
24
26
25
27
26
class UploadSessionQuery (CreateFileQuery ):
28
- def __init__ (self , container , source_path , chunk_size , chunk_uploaded ):
27
+ def __init__ (self , files , source_path , chunk_size , chunk_uploaded ):
29
28
"""
30
29
31
- :type container : office365.sharepoint.file_collection.FileCollection
30
+ :type files : office365.sharepoint.files .file_collection.FileCollection
32
31
:type source_path: str
33
32
:type chunk_size: int
34
33
:type chunk_uploaded: (int)->None
35
34
"""
36
35
37
- super ().__init__ (container , _create_empty_file (source_path ))
36
+ super ().__init__ (files , _create_empty_file (source_path ))
38
37
self ._chunk_size = chunk_size
39
38
self ._upload_id = str (uuid .uuid4 ())
40
39
self ._source_path = source_path
41
40
self ._chunk_uploaded = chunk_uploaded
42
41
self ._uploaded_bytes = 0
43
42
self ._upload_results = []
44
- container .context .afterExecuteOnce += self ._build_upload_query
45
-
46
- def _build_upload_query (self , target_file ):
47
- """
43
+ self ._binding_type .context .get_pending_request ().afterExecute += self ._build_upload_session_query
48
44
49
- :type target_file: File
50
- """
45
+ def _build_upload_session_query ( self , response ):
46
+ self . _binding_type . context . get_pending_request (). afterExecute -= self . _build_upload_session_query
51
47
st = os .stat (self ._source_path )
52
-
53
48
# upload a file in chunks
54
49
f_pos = 0
55
50
fh = open (self ._source_path , 'rb' )
56
51
for piece in read_in_chunks (fh , size = self ._chunk_size ):
57
52
if f_pos == 0 :
58
- upload_result = target_file .start_upload (self ._upload_id , piece )
53
+ upload_result = self . file .start_upload (self ._upload_id , piece )
59
54
self ._upload_results .append (upload_result )
60
55
elif f_pos + len (piece ) < st .st_size :
61
- upload_result = target_file .continue_upload (self ._upload_id , f_pos , piece )
56
+ upload_result = self . file .continue_upload (self ._upload_id , f_pos , piece )
62
57
self ._upload_results .append (upload_result )
63
58
else :
64
- self ._return_type = target_file .finish_upload (self ._upload_id , f_pos , piece )
59
+ self ._return_type = self . file .finish_upload (self ._upload_id , f_pos , piece )
65
60
f_pos += len (piece )
61
+ if self ._chunk_uploaded is not None :
62
+ self ._binding_type .context .after_query_executed (self ._process_chunk_upload )
66
63
fh .close ()
67
- if self ._chunk_uploaded is not None :
68
- self ._binding_type .context .afterExecuteOnce += self ._process_chunk_upload
69
64
70
65
def _process_chunk_upload (self , result_object ):
71
- self ._binding_type .context .afterExecuteOnce += self ._process_chunk_upload
72
66
if isinstance (result_object , ClientResult ):
73
67
self ._uploaded_bytes = int (result_object .value )
74
68
elif isinstance (result_object , File ):
75
- self ._uploaded_bytes = int ( result_object .properties [ 'Length' ])
69
+ self ._uploaded_bytes = result_object .length
76
70
self ._chunk_uploaded (self ._uploaded_bytes )
77
71
78
72
@property
79
73
def file (self ):
74
+ """
75
+ :rtype: File
76
+ """
80
77
return self .return_type
0 commit comments