11package com .genexus .db .driver ;
22
3+ import com .genexus .CommonUtil ;
34import software .amazon .awssdk .auth .credentials .*;
45import software .amazon .awssdk .core .ResponseBytes ;
56import software .amazon .awssdk .core .ResponseInputStream ;
2526
2627import java .io .*;
2728import java .net .URI ;
28- import java .net .URL ;
2929import java .net .URLEncoder ;
3030import java .nio .ByteBuffer ;
3131import java .nio .charset .StandardCharsets ;
@@ -251,13 +251,26 @@ public String upload(String externalFileName, InputStream input, ResourceAccessC
251251 public String get (String externalFileName , ResourceAccessControlList acl , int expirationMinutes ) {
252252 // Send a request to AWS S3 to retrieve the metadata for the specified object to see if
253253 // the object exists and is accessible under the provided credentials and permissions.
254- HeadObjectRequest headObjectRequest = HeadObjectRequest .builder ()
255- .bucket (bucket )
256- .key (externalFileName )
257- .build ();
258- client .headObject (headObjectRequest );
259-
260- return getResourceUrl (externalFileName , acl , expirationMinutes );
254+ try {
255+ HeadObjectRequest headObjectRequest = HeadObjectRequest .builder ()
256+ .bucket (bucket )
257+ .key (externalFileName )
258+ .build ();
259+ client .headObject (headObjectRequest );
260+ return getResourceUrl (externalFileName , acl , expirationMinutes );
261+ } catch (Exception e ) {
262+ int lastIndex = Math .max (externalFileName .lastIndexOf ('/' ), externalFileName .lastIndexOf ('\\' ));
263+ String path = lastIndex >= 0 ? externalFileName .substring (0 , lastIndex + 1 ) : "" ;
264+ String fileName = lastIndex >= 0 ? externalFileName .substring (lastIndex + 1 ) : externalFileName ;
265+ String encodedFileName = CommonUtil .encodeUtf8Once (fileName );
266+ String encodedExternalFileName = path + encodedFileName ;
267+ HeadObjectRequest headObjectRequest = HeadObjectRequest .builder ()
268+ .bucket (bucket )
269+ .key (encodedExternalFileName )
270+ .build ();
271+ client .headObject (headObjectRequest );
272+ return getResourceUrl (encodedExternalFileName , acl , expirationMinutes );
273+ }
261274 }
262275
263276 private String getResourceUrl (String externalFileName , ResourceAccessControlList acl , int expirationMinutes ) {
@@ -645,7 +658,7 @@ private String getResourceUrlWithACL(String externalFileName, ResourceAccessCont
645658 int lastIndex = Math .max (externalFileName .lastIndexOf ('/' ), externalFileName .lastIndexOf ('\\' ));
646659 String path = externalFileName .substring (0 , lastIndex + 1 );
647660 String fileName = externalFileName .substring (lastIndex + 1 );
648- String encodedFileName = URLEncoder . encode (fileName , StandardCharsets . UTF_8 . toString () );
661+ String encodedFileName = CommonUtil . encodeUtf8Once (fileName );
649662
650663 String url = String .format (
651664 "https://%s.s3.%s.amazonaws.com/%s%s" ,
@@ -656,8 +669,8 @@ private String getResourceUrlWithACL(String externalFileName, ResourceAccessCont
656669 );
657670
658671 return url ;
659- } catch (UnsupportedEncodingException uee ) {
660- logger .error ("Failed to encode resource URL for " + externalFileName , uee );
672+ } catch (Exception e ) {
673+ logger .error ("Failed to encode resource URL for " + externalFileName , e );
661674 return "" ;
662675 }
663676 }
0 commit comments