Using Digital Ocean Spaces instead of Amazon S3

Is there a way to use the S3 provided setup in Lucee to also upload to Digital Ocean Spaces? I see DO spaces are compatible with AWS S3 SDK’s ( Using DigitalOcean Spaces with AWS S3 SDKs :: DigitalOcean Documentation ) , but I haven’t been able to get an upload working (I get a perfectly reasonable “The AWS Access Key Id you provided does not exist in our records” which would make sense if it’s hitting up Amazon). Before I go for something like this ( ForgeBox: Amazon S3 SDK ), I just thought I’d check if there is a way?

not yet, but it’s something we definitely should support!

what does the top of the stacktrace look like?

That would be all kinds of amazing for sure. For a call to

s3://#DOkey#:#DOsecret#@bucketname.region.digitaloceanspaces.com

This is the stacktrace:

lucee.runtime.exp.NativeException: The AWS Access Key Id you provided does not exist in our records. at org.jets3t.service.S3Service.listAllBuckets(S3Service.java:1461) at org.lucee.extension.resource.s3.S3.list(S3.java:247) at org.lucee.extension.resource.s3.S3.get(S3.java:526) at org.lucee.extension.resource.s3.S3.exists(S3.java:421) at org.lucee.extension.resource.s3.S3Resource.exists(S3Resource.java:313) at lucee.commons.io.res.util.ResourceUtil.toResourceNotExisting(ResourceUtil.java:323) at lucee.commons.io.res.util.ResourceUtil.toResourceNotExisting(ResourceUtil.java:315) at lucee.runtime.tag.FileTag.toDestination(FileTag.java:519) at lucee.runtime.tag.FileTag._actionUpload(FileTag.java:916) at lucee.runtime.tag.FileTag.actionUpload(FileTag.java:831) at lucee.runtime.tag.FileTag.doStartTag(FileTag.java:412) at admin.upload_photos_cfm$cf$4k.call(/admin/upload_photos.cfm:12) at lucee.runtime.PageContextImpl._doInclude(PageContextImpl.java:914) at lucee.runtime.PageContextImpl._doInclude(PageContextImpl.java:837) at lucee.runtime.listener.ModernAppListener._onRequest(ModernAppListener.java:216) at lucee.runtime.listener.MixedAppListener.onRequest(MixedAppListener.java:42) at lucee.runtime.PageContextImpl.execute(PageContextImpl.java:2416) at lucee.runtime.PageContextImpl._execute(PageContextImpl.java:2406) at lucee.runtime.PageContextImpl.executeCFML(PageContextImpl.java:2381) at lucee.runtime.engine.Request.exe(Request.java:43) at lucee.runtime.engine.CFMLEngineImpl._service(CFMLEngineImpl.java:1170) at lucee.runtime.engine.CFMLEngineImpl.serviceCFML(CFMLEngineImpl.java:1116) at lucee.loader.engine.CFMLEngineWrapper.serviceCFML(CFMLEngineWrapper.java:97) at lucee.loader.servlet.CFMLServlet.service(CFMLServlet.java:51) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:431) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.lucee.extension.resource.s3.S3Exception: The AWS Access Key Id you provided does not exist in our records. ... 47 more Caused by: org.jets3t.service.S3ServiceException: Service Error Message. -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error Message: <?xml version="1.0" encoding="UTF-8"?><Error><Code>InvalidAccessKeyId</Code><Message>The AWS Access Key Id you provided does not exist in our records.</Message><AWSAccessKeyId>E6BBDQ2PO45NM23KKLIP</AWSAccessKeyId><RequestId>FPVVQSRBZC94CZXP</RequestId><HostId>naVo7NJDCINmudAc27gI3PurcV2Pivbs2P7CAboDXuViU6xQrNoYjjm38EUbETj5yivuznjqcKU=</HostId></Error> ... 47 more