{"record":{"id":"c14ccbda90a00690","repo":"conductor-oss/conductor","slug":"configured-file-storage-does-not-support-content-s","errorCode":null,"errorMessage":"Configured file storage does not support content streaming","messagePattern":"Configured file storage does not support content streaming","errorType":"exception","errorClass":"FileStorageException","httpStatus":413,"severity":"error","filePath":"core/src/main/java/org/conductoross/conductor/core/storage/FileStorage.java","lineNumber":54,"sourceCode":"     */\n    String generateUploadUrl(String storagePath, Duration expiration);\n\n    /** Returns a fresh presigned download URL (or backend-equivalent) for {@code storagePath}. */\n    String generateDownloadUrl(String storagePath, Duration expiration);\n\n    /**\n     * Reads existence, content hash, and actual byte size from the storage backend in a single\n     * call. Returns {@code null} if the object is not present. {@code contentHash} is {@code null}\n     * for backends that do not expose one.\n     */\n    StorageFileInfo getStorageFileInfo(String storagePath);\n\n    /**\n     * Streams content to a backend-managed storage path without buffering it in the service layer.\n     * Backends that only support client-side signed URLs can retain the default implementation.\n     */\n    default void writeContent(String storagePath, InputStream content) {\n        throw new FileStorageException(\n                \"Configured file storage does not support content streaming\");\n    }\n\n    /**\n     * Opens content for streaming from a backend-managed storage path. The caller closes the\n     * returned stream. Backends that only support client-side signed URLs can retain the default\n     * implementation.\n     */\n    default InputStream readContent(String storagePath) {\n        throw new FileStorageException(\n                \"Configured file storage does not support content streaming\");\n    }\n\n    /** Starts a backend-native multipart upload and returns its backend-specific upload ID. */\n    String initiateMultipartUpload(String storagePath);\n\n    /**\n     * Returns a signed URL for one multipart part. Provider-specific query parameters may be added","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/core/src/main/java/org/conductoross/conductor/core/storage/FileStorage.java#L36-L72","documentation":"Default implementation of FileStorage.writeContent throws FileStorageException when the configured backend does not support server-side content streaming. FileStorageServiceImpl.uploadContent calls this to stream bytes directly to the backend; backends that only issue presigned/client-side URLs keep the default and therefore cannot accept streamed writes. FileStorageException extends NonTransientException, so it is not retried.","triggerScenarios":"Calling the content upload endpoint (uploadContent / POST content) when the active FileStorage implementation did not override writeContent. I.e., the backend is a presigned-URL-only provider.","commonSituations":"Using the Conductor-managed local/file backend or a custom BYO storage that only implements generateUploadUrl; client code path that streams content directly to the server instead of using the presigned upload URL flow.","solutions":["Use the presigned URL flow: createFile returns an upload URL; PUT content directly to that URL, then confirmUpload.","If server-side streaming is required, provide a FileStorage implementation that overrides writeContent.","Switch to a backend that supports content streaming (e.g. one with a managed upload)."],"exampleFix":"// before - streaming to a presigned-URL-only backend\nfileStorageService.uploadContent(wfId, fileId, inputStream); // throws\n\n// after - use the presigned URL returned by createFile\nFileUploadResponse resp = fileStorageService.createFile(req);\nhttp.put(resp.getUploadUrl(), fileBytes);\nfileStorageService.confirmUpload(wfId, resp.getFileId());","handlingStrategy":"validation","validationCode":"// Check capability before streaming\nboolean canStream = /* your backend overrides writeContent */;","typeGuard":null,"tryCatchPattern":"try {\n    fileStorageService.uploadContent(wfId, fileId, in);\n} catch (FileStorageException e) {\n    // backend is presigned-URL-only; use the URL flow instead\n}","preventionTips":["Default to the presigned URL upload flow for portability","Override writeContent in custom backends that must accept streamed writes"],"tags":["file-storage","streaming","backend","conductor","java"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}