88import ckan .lib .base as base
99import ckan .model as model
1010import ckan .lib .uploader as uploader
11- from ckan .common import _ , request , c , response
11+ from ckan .common import _ , request , c , response , streaming_response
1212from botocore .exceptions import ClientError
1313
1414from ckanext .s3filestore .uploader import S3Uploader
15+ import webob
1516
1617import logging
1718log = logging .getLogger (__name__ )
@@ -45,6 +46,7 @@ def resource_download(self, id, resource_id, filename=None):
4546 upload = uploader .get_resource_uploader (rsc )
4647 bucket_name = config .get ('ckanext.s3filestore.aws_bucket_name' )
4748 region = config .get ('ckanext.s3filestore.region_name' )
49+ host_name = config .get ('ckanext.s3filestore.host_name' )
4850 bucket = upload .get_s3_bucket (bucket_name )
4951
5052 if filename is None :
@@ -57,8 +59,15 @@ def resource_download(self, id, resource_id, filename=None):
5759 .format (key_path , bucket_name ))
5860
5961 try :
60- obj = bucket .Object (key_path )
61- contents = str (obj .get ()['Body' ].read ())
62+ # Small workaround to manage downloading of large files
63+ # We are using redirect to minio's resource public URL
64+ s3 = upload .get_s3_session ()
65+ client = s3 .client (service_name = 's3' , endpoint_url = host_name )
66+ url = client .generate_presigned_url (ClientMethod = 'get_object' ,
67+ Params = {'Bucket' : bucket .name ,
68+ 'Key' : key_path })
69+ redirect (url )
70+
6271 except ClientError as ex :
6372 if ex .response ['Error' ]['Code' ] == 'NoSuchKey' :
6473 # attempt fallback
@@ -79,24 +88,6 @@ def resource_download(self, id, resource_id, filename=None):
7988 else :
8089 raise ex
8190
82- dataapp = paste .fileapp .DataApp (contents )
83-
84- try :
85- status , headers , app_iter = request .call_application (dataapp )
86- except OSError :
87- abort (404 , _ ('Resource data not found' ))
88-
89- response .headers .update (dict (headers ))
90- response .status = status
91- content_type , x = mimetypes .guess_type (rsc .get ('url' , '' ))
92- if content_type :
93- response .headers ['Content-Type' ] = content_type
94- return app_iter
95-
96- elif 'url' not in rsc :
97- abort (404 , _ ('No download is available' ))
98- redirect (str (rsc ['url' ]))
99-
10091 def filesystem_resource_download (self , id , resource_id , filename = None ):
10192 """
10293 A fallback controller action to download resources from the
0 commit comments