1- function uploadFilesForDatasetDocuments(cloudDatasetId , ndiDataset , dataset_documents , options )
1+ function [ success , message ] = uploadFilesForDatasetDocuments(cloudDatasetId , ndiDataset , dataset_documents , options )
22% uploadFilesForDatasetDocuments - Upload a set of files belonging to a set of dataset documents
33 arguments
44 cloudDatasetId (1 ,1 ) string
@@ -7,13 +7,44 @@ function uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_docu
77 options.Verbose (1 ,1 ) logical = true
88 options.FileUploadStrategy (1 ,1 ) string ...
99 {mustBeMember(options .FileUploadStrategy , [" serial" , " batch" ])} = " batch"
10+ options.updateMissing (1 ,1 ) logical = true
1011 end
1112
13+ success = true ;
14+ message = ' ' ;
15+
1216 file_manifest = ...
1317 ndi .database .internal .list_binary_files(...
1418 ndiDataset , dataset_documents , options .Verbose );
1519 [file_manifest(: ).is_uploaded] = deal(false );
1620
21+ if options .updateMissing
22+ [b , answer ] = ndi .cloud .api .datasets .getDataset(cloudDatasetId );
23+ if b && isfield(answer , ' files' )
24+ remote_files = containers .Map();
25+ for i= 1 : numel(answer .files )
26+ remote_files(answer .files(i ).uid) = 1 ;
27+ end
28+
29+ files_to_upload = struct(' uid' ,{},' bytes' ,{},' file_path' ,{},' is_uploaded' ,{});
30+ for i= 1 : numel(file_manifest )
31+ if ~isKey(remote_files , file_manifest(i ).uid)
32+ files_to_upload(end + 1 ) = file_manifest(i );
33+ end
34+ end
35+ file_manifest = files_to_upload ;
36+ else
37+ success = false ;
38+ message = ' Could not retrieve remote dataset file list.' ;
39+ return ;
40+ end
41+ end
42+
43+ if isempty(file_manifest )
44+ message = ' All files are already on the remote.' ;
45+ return ;
46+ end
47+
1748 totalSizeKb = sum([file_manifest .bytes ]) / 1e3 ;
1849
1950 switch options .FileUploadStrategy
@@ -23,13 +54,30 @@ function uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_docu
2354 app .addBar(' Label' ,' Uploading document-associated binary files' ,' tag' ,uuid ,' Auto' ,true );
2455 for i= 1 : numel(file_manifest )
2556 if file_manifest(i ).is_uploaded== false
26- [success ,uploadURL ]=ndi .cloud .api .files .getFileUploadURL(cloudDatasetId ,file_manifest(i ).uid);
27- if ~success , warning(' Failed to get upload URL' ); continue ; end
28- [~ ] = ndi .cloud .api .files .putFiles(uploadURL ,file_manifest(i ).file_path);
57+ [url_success ,uploadURL ]=ndi .cloud .api .files .getFileUploadURL(cloudDatasetId ,file_manifest(i ).uid);
58+ if ~url_success
59+ warning(' Failed to get upload URL' );
60+ if success
61+ message = [' Failed to get upload URL for ' file_manifest(i ).uid];
62+ end
63+ success = false ;
64+ continue ;
65+ end
66+ [put_success ] = ndi .cloud .api .files .putFiles(uploadURL ,file_manifest(i ).file_path);
67+ if ~put_success
68+ if success
69+ message = [' Failed to upload file ' file_manifest(i ).uid];
70+ end
71+ success = false ;
72+ end
2973 end
3074 app .updateBar(uuid ,i / numel(file_manifest ));
3175 end
3276 case " batch"
33- [~ , ~ ] = ndi .cloud .upload .zipForUpload(ndiDataset , file_manifest , totalSizeKb , cloudDatasetId );
77+ [batch_success , batch_message ] = ndi .cloud .upload .zipForUpload(ndiDataset , file_manifest , totalSizeKb , cloudDatasetId );
78+ if ~batch_success
79+ success = false ;
80+ message = batch_message ;
81+ end
3482 end
3583end
0 commit comments