Child of #2962, sequenced LAST. Phase 1 only: vendor/wheels/storage/ disk abstraction — local + S3 adapters, signed URLs; S3 via plain cfhttp request signing (no JARs). Phase 2 (Rails-style hasOneAttached model macro + polymorphic blob tables) gets its own issue later ONLY if demand shows; storage adapters alone cover most demand at a fraction of the effort.
Child of #2962, sequenced LAST. Phase 1 only: vendor/wheels/storage/ disk abstraction — local + S3 adapters, signed URLs; S3 via plain cfhttp request signing (no JARs). Phase 2 (Rails-style hasOneAttached model macro + polymorphic blob tables) gets its own issue later ONLY if demand shows; storage adapters alone cover most demand at a fraction of the effort.