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
- Complete the upload first: PUT content to the presigned URL, then call confirmUpload.
- Inspect the file metadata (getFileMetadata) to check uploadStatus before requesting a download.
- 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
- Confirm the upload before requesting a download URL
- Check uploadStatus via metadata before downloading
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
- File is not accepting content uploads: {}
- File has not been uploaded: {}
- File already uploaded: {}
- File not found on storage backend: {}
- conductor.file-storage.conductor.signing.keys is required wh
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/ea67f64ba930629b.
Report an issue: GitHub.