Jump to content

Search the Community

Showing results for tags 's3'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Delphi Questions and Answers
    • Algorithms, Data Structures and Class Design
    • VCL
    • FMX
    • RTL and Delphi Object Pascal
    • Databases
    • Network, Cloud and Web
    • Windows API
    • Cross-platform
    • Delphi IDE and APIs
    • General Help
    • Delphi Third-Party
  • C++Builder Questions and Answers
    • General Help
  • General Discussions
    • Embarcadero Lounge
    • Tips / Blogs / Tutorials / Videos
    • Job Opportunities / Coder for Hire
    • I made this
  • Software Development
    • Project Planning and -Management
    • Software Testing and Quality Assurance
  • Community
    • Community Management

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Delphi-Version

Found 1 result

  1. M. Toussaint

    Download file from AWS S3 to stream

    Hi, From our application we use several procedures and functions to upload files to AWS S3 and also download text-like files from AWS S3. We use the function below to get the contents of text-like files (.SVG, .TXT, .CSV) from S3, but we have no idea how to (download and) process binary files. function S3Get_Object_AsString(const bucket, key: string): string; var pyKey : TPythonDelphiVar; pyBucket : TPythonDelphiVar; pyObj : TPythonDelphiVar; PyEngine : IPyEngineAndGIL; pyError : TPythonDelphiVar; Script : TStringList; cModuleName : AnsiString; begin pyKey := TPythonDelphiVar.Create(nil); pyBucket := TPythonDelphiVar.Create(nil); pyObj := TPythonDelphiVar.Create(nil); pyError := TPythonDelphiVar.Create(nil); script := TStringList.Create; try PyEngine := TPyEngineAndGIL.Create; cModuleName := AnsiString(TGUID.NewGuid.ToString); pyBucket.Engine := PyEngine.getPyEngine; pyBucket.VarName := 'BUCKET'; pyBucket.Module := cModuleName; pyBucket.Initialize; pyBucket.Value := bucket; pyKey.Engine := PyEngine.getPyEngine; pyKey.VarName := 'S3KEY'; pyKey.Module := cModuleName; pyKey.Initialize; pyKey.Value := key; pyObj.Engine := PyEngine.getPyEngine; pyObj.VarName := 'OBJ'; pyObj.Module := cModuleName; pyObj.Initialize; pyError.Engine := PyEngine.getPyEngine; pyError.VarName := 'ERROR'; pyError.Module := cModuleName; pyError.Initialize; pyError.Value := ''; InitBotoClient(Script); Script.Add('import json '); Script.Add('from botocore.exceptions import ClientError '); Script.Add('s3_client = client(''s3'')'); Script.Add('try: ' ); Script.Add(' s3_object = s3_client.get_object(Bucket=BUCKET.VALUE, Key=S3KEY.VALUE)'); Script.Add(' OBJ.VALUE = s3_object[''Body''].read()'); Script.Add('except ClientError as e: '); Script.Add(' print("Get Object failed:" + e.response[''Error''][''Message''])'); Script.Add('else:'); Script.Add(' print("Get Object:" + BUCKET.VALUE + "-" + S3KEY.VALUE)'); PyEngine.getPyEngine.ExecModule := cModuleName; PyEngine.getPyEngine.ExecStrings(Script); if pyError.ValueAsString <> '' then begin //Log(pyError.ValueAsString + 'bucket: ' + bucket + ' key:' + key , 'E'); result := ''; end else begin if VarIsStr(pyObj.Value) then result := pyObj.Value else result := ''; end; finally Script.Free; pyBucket.Finalize; pyKey.Finalize; pyObj.Finalize; pyError.Finalize; pyBucket.Free; pyKey.Free; pyObj.Free; pyError.Free; end; end; So far we found an alternative for downloading a file object from S3, but how to process this in Delphi? Script.Add('import json '); Script.Add('import io '); Script.Add('from botocore.exceptions import ClientError '); Script.Add('s3_client = client(''s3'')'); Script.Add('io_stream = io.BytesIO()'); Script.Add('try: ' ); // Script.Add(' s3_object = s3_client.get_object(Bucket=BUCKET.VALUE, Key=S3KEY.VALUE, )'); // Script.Add(' OBJ.VALUE = s3_object[''Body''].read()'); // Use download_fileobj to gat a file-like object Script.Add(' s3_client.download_fileobj(Bucket=BUCKET.VALUE, Key=S3KEY.VALUE, Fileobj=io_stream)'); Script.Add(' io_stream.seek(0)'); Script.Add(' OBJ.VALUE = io_stream.getvalue()'); Script.Add('except ClientError as e: '); Script.Add(' print("Get Object failed:" + e.response[''Error''][''Message''])'); Script.Add('else:'); Script.Add(' print("Get Object:" + BUCKET.VALUE + "-" + S3KEY.VALUE)');
×