conductor-oss/conductor · error · FileStorageException

Configured file storage does not support content streaming

Error message

Configured file storage does not support content streaming

What it means

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.

Source

Thrown at core/src/main/java/org/conductoross/conductor/core/storage/FileStorage.java:54

     */
    String generateUploadUrl(String storagePath, Duration expiration);

    /** Returns a fresh presigned download URL (or backend-equivalent) for {@code storagePath}. */
    String generateDownloadUrl(String storagePath, Duration expiration);

    /**
     * Reads existence, content hash, and actual byte size from the storage backend in a single
     * call. Returns {@code null} if the object is not present. {@code contentHash} is {@code null}
     * for backends that do not expose one.
     */
    StorageFileInfo getStorageFileInfo(String storagePath);

    /**
     * Streams content to a backend-managed storage path without buffering it in the service layer.
     * Backends that only support client-side signed URLs can retain the default implementation.
     */
    default void writeContent(String storagePath, InputStream content) {
        throw new FileStorageException(
                "Configured file storage does not support content streaming");
    }

    /**
     * Opens content for streaming from a backend-managed storage path. The caller closes the
     * returned stream. Backends that only support client-side signed URLs can retain the default
     * implementation.
     */
    default InputStream readContent(String storagePath) {
        throw new FileStorageException(
                "Configured file storage does not support content streaming");
    }

    /** Starts a backend-native multipart upload and returns its backend-specific upload ID. */
    String initiateMultipartUpload(String storagePath);

    /**
     * Returns a signed URL for one multipart part. Provider-specific query parameters may be added

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Use the presigned URL flow: createFile returns an upload URL; PUT content directly to that URL, then confirmUpload.
  2. If server-side streaming is required, provide a FileStorage implementation that overrides writeContent.
  3. Switch to a backend that supports content streaming (e.g. one with a managed upload).

Example fix

// before - streaming to a presigned-URL-only backend
fileStorageService.uploadContent(wfId, fileId, inputStream); // throws

// after - use the presigned URL returned by createFile
FileUploadResponse resp = fileStorageService.createFile(req);
http.put(resp.getUploadUrl(), fileBytes);
fileStorageService.confirmUpload(wfId, resp.getFileId());
Defensive patterns

Strategy: validation

Validate before calling

// Check capability before streaming
boolean canStream = /* your backend overrides writeContent */;

Try / catch

try {
    fileStorageService.uploadContent(wfId, fileId, in);
} catch (FileStorageException e) {
    // backend is presigned-URL-only; use the URL flow instead
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/c14ccbda90a00690. Report an issue: GitHub.