apache/dolphinscheduler · error · ServiceException
Download the resource file: {fileAbsolutePath} failed
Error message
Download the resource file: {fileAbsolutePath} failed What it means
ResourcesServiceImpl.downloadResource wraps any exception while streaming a resource file to the HTTP response into ServiceException("Download the resource file: <path> failed", e). It copies a local tmp file (previously fetched from storage) to the servlet output stream; failures reading the file, storage retrieval errors, or broken client connections surface here. The tmp file is deleted in finally regardless of outcome.
Source
Thrown at dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ResourcesServiceImpl.java:380
.build();
downloadFileDtoValidator.validate(downloadFileDto);
String fileName = new File(downloadFileDto.getFileAbsolutePath()).getName();
String localTmpFileAbsolutePath = FileUtils.getDownloadFilename(fileName);
try {
storageOperator.download(downloadFileRequest.getFileAbsolutePath(), localTmpFileAbsolutePath, true);
int length = (int) new File(localTmpFileAbsolutePath).length();
ApiServerMetrics.recordApiResourceDownloadSize(length);
response.reset();
response.setContentType("application/octet-stream");
response.setCharacterEncoding("utf-8");
response.setContentLength(length);
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
Files.copy(Paths.get(localTmpFileAbsolutePath), response.getOutputStream());
} catch (Exception e) {
throw new ServiceException(
"Download the resource file: " + downloadFileRequest.getFileAbsolutePath() + " failed", e);
} finally {
FileUtils.deleteFile(localTmpFileAbsolutePath);
}
}
@Override
public StorageEntity queryFileStatus(String userName, String fileAbsolutePath) {
return storageOperator.getStorageEntity(fileAbsolutePath);
}
@Override
public String queryResourceBaseDir(User loginUser, ResourceType type) {
User user = userDao.queryById(loginUser.getId());
if (user == null) {
throw new ServiceException(Status.USER_NOT_EXIST);
}View on GitHub (pinned to 02eac45a1b)
Solutions
- Check the wrapped cause in server logs: a missing storage object means the resource metadata is stale — re-upload or remove the resource entry.
- Verify storage connectivity and credentials from the API server, then retry the download.
- If the cause is a client disconnect (broken pipe), it is benign — retry the download from a stable connection.
Example fix
// before: stale resource entry pointing to deleted S3 object GET /resources/download -> "Download the resource file: /wf/script.sql failed" // after: re-upload the file via the resource center, then download succeeds
Defensive patterns
Strategy: try-catch
Validate before calling
// verify the resource exists in storage before downloading // e.g. storageOperator.exists(resourceAbsolutePath) == true
Try / catch
try {
resourcesService.downloadResource(response, request);
} catch (ServiceException e) {
if (e.getCause() instanceof NoSuchFileException) {
// re-upload or remove stale resource entry
}
} Prevention
- Keep storage objects and resource metadata in sync
- Warn users not to cancel downloads abruptly in automation
- Monitor storage connectivity from API servers
When it happens
Trigger: Downloading a resource whose backing object is missing from HDFS/S3; local tmp write/read failure (disk full, permissions); client disconnects mid-copy causing IOException on the output stream.
Common situations: Storage object deleted externally or by retention policy while metadata row remains; browser canceled download causing broken-pipe; API server cannot reach storage cluster.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Update the resource file from content: {fileAbsolutePath} fa
- Create xlsx directory error
- generate excel error
- USER_NOT_EXIST
- Thr resource is not exists: ${resourceAbsolutePath}
AI-assisted analysis of apache/dolphinscheduler@02eac45a1b (2026-09-06).
Data as JSON: /api/errors/9b36bba9e48d2658.
Report an issue: GitHub.