conductor-oss/conductor · error · IllegalArgumentException

File has not been uploaded: {}

Error message

File has not been uploaded: {}

What it means

Thrown by FileStorageServiceImpl.downloadContent when the file's upload status is not UPLOADED. Content cannot be streamed for a file that was never confirmed uploaded. Raised as IllegalArgumentException (HTTP 400). This is the streaming equivalent of error 472.

Source

Thrown at core/src/main/java/org/conductoross/conductor/core/storage/FileStorageServiceImpl.java:154

        return response;
    }

    @Override
    public void uploadContent(String workflowId, String fileId, InputStream content) {
        FileModel model = getOwnedFile(workflowId, fileId);
        if (model.getUploadStatus() != FileUploadStatus.UPLOADING) {
            throw new ConflictException("File is not accepting content uploads: " + fileId);
        }
        fileStorage.writeContent(model.getStoragePath(), content);
    }

    @Override
    public FileContent downloadContent(String workflowId, String fileId) {
        // Family-accessible, like getDownloadUrl: for the Conductor backend that URL is this
        // endpoint, so requiring the exact owner here would 403 a URL we just handed out.
        FileModel model = getFamilyAccessibleFile(workflowId, fileId);
        if (model.getUploadStatus() != FileUploadStatus.UPLOADED) {
            throw new IllegalArgumentException("File has not been uploaded: " + fileId);
        }
        return new FileContent(
                fileStorage.readContent(model.getStoragePath()),
                model.getContentType(),
                model.getStorageContentSize());
    }

    @Override
    public FileHandle getFileMetadata(String workflowId, String fileId) {
        FileModel model = getFamilyAccessibleFile(workflowId, fileId);
        return FileModelConverter.toFileHandle(model);
    }

    @Override
    public MultipartInitResponse initiateMultipartUpload(String workflowId, String fileId) {
        FileModel model = getOwnedFile(workflowId, fileId);
        String uploadId = fileStorage.initiateMultipartUpload(model.getStoragePath());

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Confirm the upload (confirmUpload) before calling downloadContent.
  2. Check getFileMetadata uploadStatus first and only download when UPLOADED.
  3. Redo the upload flow if it never completed.

Example fix

// before
FileContent c = fileStorageService.downloadContent(wfId, fileId); // throws

// after
fileStorageService.confirmUpload(wfId, fileId);
FileContent c = fileStorageService.downloadContent(wfId, fileId);
Defensive patterns

Strategy: validation

Validate before calling

FileHandle meta = fileStorageService.getFileMetadata(wfId, fileId);
if (meta.getUploadStatus() == FileUploadStatus.UPLOADED) {
    fileStorageService.downloadContent(wfId, fileId);
}

Try / catch

try {
    FileContent c = fileStorageService.downloadContent(wfId, fileId);
} catch (IllegalArgumentException e) {
    // file not uploaded yet
}

Prevention

When it happens

Trigger: Calling downloadContent before confirmUpload; upload was started but never confirmed; download attempted on an UPLOADING record.

Common situations: Client requesting streamed content mid-upload; skipped the confirm step; prior upload/confirm failed.

Related errors


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