siyuan-note/siyuan · error
Upload failed
Error message
Upload failed: %s
What it means
The cloud upload request completed (2xx) but the business response carried a non-zero code; the server's message is embedded via the localized 'Upload failed: %s' (Conf.Language(94)). This is distinct from ErrFailedToConnectCloudServer (network) and the 401 auth case: the server received and actively rejected the upload.
Solutions
- Read the embedded server message to identify the concrete rejection reason
- Free up cloud storage (delete old cloud backups) or increase the quota, then retry
- Confirm each asset is under the local size limit that gates uploads before batching
- If the message indicates a transient server issue, retry later
Defensive patterns
Strategy: try-catch
Try / catch
Wrap UploadAssets2Cloud in error handling that distinguishes the three failure modes - ErrFailedToConnectCloudServer (network), the re-login message (auth, abort), and this wrapped rejection - and surface the embedded server message verbatim; allow retry only for quota/transient causes.
Prevention
- Monitor cloud storage usage before bulk uploads
- Pre-filter assets by size before batching
- Act on the embedded server message rather than the generic wrapper text
When it happens
Trigger: Cloud storage quota exceeded; the file violates server-side limits (type or remaining size); the server returns a business error during maintenance or request validation.
Common situations: Free-tier cloud storage full; assets near the size limit; account state changes mid-batch.
Related errors
- Account authentication failed, please login again
- Backup failed: The cloud can only support backup up to 12…
- Conf.Language(31)
- Conf.Language(31) (localized cloud auth failure message)
- Conf.Language(94)
AI-assisted analysis of siyuan-note/siyuan@afa823b6b4 (2026-08-18).
Data as JSON: /api/errors/30d37f8e2ff70e8a.
Report an issue: GitHub.
Appendix: source
Thrown at kernel/model/assets.go:1384
SetSuccessResult(requestResult).
SetFile("file[]", absAsset).
SetCookies(&http.Cookie{Name: "symphony", Value: uploadToken}).
SetHeader("meta-type", metaType).
SetHeader("biz-type", bizType).
Post(util.GetCloudServer() + "/apis/siyuan/upload?ver=" + util.Ver)
if nil != reqErr {
logging.LogErrorf("upload assets failed: %s", reqErr)
return count, ErrFailedToConnectCloudServer
}
if 401 == resp.StatusCode {
err = errors.New(Conf.Language(31))
return
}
if 0 != requestResult.Code {
logging.LogErrorf("upload assets failed: %s", requestResult.Msg)
err = fmt.Errorf(Conf.Language(94), requestResult.Msg)
return
}
absAsset = filepath.ToSlash(absAsset)
relAsset := absAsset[strings.Index(absAsset, "assets/"):]
completedUploadAssets = append(completedUploadAssets, relAsset)
logging.LogInfof("uploaded asset [%s]", relAsset)
count++
}
if !ignorePushMsg {
util.PushClearMsg(msgId)
}
if 0 < len(completedUploadAssets) {
logging.LogInfof("uploaded [%d] assets", len(completedUploadAssets))
}
returnView on GitHub (pinned to afa823b6b4)