@@ -254,6 +254,8 @@ def add_standard_routes(self):
254254 methods = ['POST' , 'GET' ])
255255 self .app .add_url_rule ('/retrieve_obj' , 'retrieve_obj' , self .retrieve_obj ,
256256 methods = ['POST' , 'GET' ])
257+ self .app .add_url_rule ('/tiled_upload_data' , 'tiled_upload_data' , self .tiled_upload_data ,
258+ methods = ['POST' ])
257259
258260 # self.init is now called from run()/run_threaded due to Flask 3 removal
259261 # of the before_first_request hook
@@ -599,6 +601,59 @@ def retrieve_obj(self):
599601 result = serialization .serialize (result )
600602 return jsonify ({'obj' :result }),200
601603
604+ def tiled_upload_data (self ):
605+ """Upload an xarray/csv/tsv payload to Tiled via multipart form data."""
606+ upload_file = request .files .get ('file' )
607+ if upload_file is None :
608+ return jsonify ({
609+ 'status' : 'error' ,
610+ 'message' : 'No file payload provided in form field "file".' ,
611+ }), 400
612+
613+ upload_bytes = upload_file .read ()
614+ if not upload_bytes :
615+ return jsonify ({
616+ 'status' : 'error' ,
617+ 'message' : 'Uploaded file is empty.' ,
618+ }), 400
619+
620+ form = request .form
621+ metadata_payload = form .get ('metadata' , '' )
622+
623+ upload_kwargs = {
624+ 'upload_bytes' : upload_bytes ,
625+ 'filename' : upload_file .filename or '' ,
626+ 'file_format' : form .get ('file_format' , '' ),
627+ 'coordinate_column' : form .get ('coordinate_column' , '' ),
628+ 'metadata' : metadata_payload ,
629+ 'delimiter' : form .get ('delimiter' , '' ),
630+ }
631+
632+ # Allow direct metadata fields in form without requiring JSON blob.
633+ metadata_keys = [
634+ 'sample_name' ,
635+ 'sample_uuid' ,
636+ 'AL_campaign_name' ,
637+ 'AL_uuid' ,
638+ 'task_name' ,
639+ 'driver_name' ,
640+ ]
641+ for key in metadata_keys :
642+ value = form .get (key , '' )
643+ if value :
644+ upload_kwargs [key ] = value
645+
646+ result = self .driver .tiled_upload_dataset (** upload_kwargs )
647+ if isinstance (result , dict ) and result .get ('status' ) == 'success' :
648+ return jsonify (result ), 200
649+
650+ if isinstance (result , dict ):
651+ return jsonify (result ), 400
652+ return jsonify ({
653+ 'status' : 'error' ,
654+ 'message' : 'Unexpected response from tiled upload handler.' ,
655+ }), 500
656+
602657
603658 @jwt_required ()
604659 def set_driver_object (self ):
0 commit comments