conductor-oss/conductor · error · IllegalArgumentException

File not yet uploaded: {}, status={}

Error message

File not yet uploaded: {}, status={}

What it means

Thrown by FileStorageServiceImpl.getDownloadUrl when the file's upload status is not UPLOADED (e.g. still UPLOADING). A download URL cannot be issued for content that has not been confirmed uploaded. Raised as IllegalArgumentException (HTTP 400); the status value is appended to aid diagnosis.

Source

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

        if (info == null || !info.isExists()) {
            throw new NonTransientException("File not found on storage backend: " + fileId);
        }

        fileMetadataDAO.updateUploadComplete(
                fileId, FileUploadStatus.UPLOADED, info.getContentHash(), info.getContentSize());

        FileUploadCompleteResponse response = new FileUploadCompleteResponse();
        response.setFileHandleId(FileIdToFileHandleIdConverter.toFileHandleId(fileId));
        response.setUploadStatus(FileUploadStatus.UPLOADED);
        response.setContentHash(info.getContentHash());
        return response;
    }

    @Override
    public FileDownloadUrlResponse getDownloadUrl(String workflowId, String fileId) {
        FileModel model = getFamilyAccessibleFile(workflowId, fileId);
        if (model.getUploadStatus() != FileUploadStatus.UPLOADED) {
            throw new IllegalArgumentException(
                    "File not yet uploaded: " + fileId + ", status=" + model.getUploadStatus());
        }
        String downloadUrl =
                fileStorage.generateDownloadUrl(
                        model.getStoragePath(), properties.getSignedUrlExpiration());
        long expiresAt = Instant.now().plus(properties.getSignedUrlExpiration()).toEpochMilli();

        FileDownloadUrlResponse response = new FileDownloadUrlResponse();
        response.setFileHandleId(FileIdToFileHandleIdConverter.toFileHandleId(fileId));
        response.setDownloadUrl(downloadUrl);
        response.setExpiresAt(expiresAt);
        return response;
    }

    @Override
    public void uploadContent(String workflowId, String fileId, InputStream content) {
        FileModel model = getOwnedFile(workflowId, fileId);
        if (model.getUploadStatus() != FileUploadStatus.UPLOADING) {

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Complete the upload first: PUT content to the presigned URL, then call confirmUpload.
  2. Inspect the file metadata (getFileMetadata) to check uploadStatus before requesting a download.
  3. Retry the full upload flow if the prior upload failed.

Example fix

// before
FileDownloadUrlResponse r = fileStorageService.getDownloadUrl(wfId, fileId); // throws, status=UPLOADING

// after - confirm the upload before requesting download
fileStorageService.confirmUpload(wfId, fileId);
FileDownloadUrlResponse r = fileStorageService.getDownloadUrl(wfId, fileId);
Defensive patterns

Strategy: validation

Validate before calling

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

Try / catch

try {
    fileStorageService.getDownloadUrl(wfId, fileId);
} catch (IllegalArgumentException e) {
    // file not yet uploaded; complete upload first
}

Prevention

When it happens

Trigger: Calling getDownloadUrl before confirmUpload has completed; the upload was never confirmed; a failed upload left the record in UPLOADING status.

Common situations: Client requesting a download URL mid-upload; skipped the confirm step; upload failed and the record was never advanced to UPLOADED.

Related errors


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