How to efficiently allow for users to view Amazon S3 content?

Solution
    bucket = app.config.get('BOTO3_BUCKET', None)
    client = boto_flask.clients.get('s3')

    params = {}
    params['Bucket'] = bucket
    params['Key'] = attachment_model.s3_filename
    params['ResponseContentDisposition'] = 'attachment; filename={0}'.format(attachment_model.filename)
    if attachment_model.mimetype is not None:
        params['ResponseContentType'] = attachment_model.mimetype

    url = client.generate_presigned_url('get_object', ExpiresIn=3600, Params=params)

    acl_permission = 'private' if private_attachment else 'public-read'
    condition = [{'acl': acl_permission},
                 ["starts-with", "$key", '{0}/'.format(folder_name)],
                 {'Content-Type': mimetype }]

    bucket = app.config.get('BOTO3_BUCKET', None)
    fields = {"acl": acl_permission, 'Bucket': bucket, 'Content-Type': mimetype}
    client = boto_flask.clients.get('s3')
    s3_credentials = client.generate_presigned_post(bucket, s3_filename, Fields=fields, Conditions=condition, ExpiresIn=3600)
    bucket = app.config.get('BOTO3_BUCKET', None)
    client = boto_flask.clients.get('s3')
    response = client.head_object(Bucket=bucket, Key=s3_filename)
    if response is None:
        return None, None

    md5 = response.get('ETag').replace('"', '')
    size = response.get('ContentLength')
//frontend asking backend to create credentials, frontend will send some file metadata
AttachmentService.createPostUrl(payload).then((responseCredentials) => {
    let form = new FormData();
    Object.keys(responseCredentials.s3.fields).forEach(key => {
      form.append(key, responseCredentials.s3.fields[key]);
    });
    form.append("file", file);
    let payload = {
        data: form,
        url: responseCredentials.s3.url
    }
    
    //Frontend will send file to S3
    axios.post(payload.url, payload.data).then((res) => {
      return Promise.resolve(true);
    }).then((result) => {

        //when it is done, frontend informs backend
        AttachmentService.uploadSuccess(...).then((refreshCase) => {
            //Success 
        });
    });
});