{"record":{"id":"30d37f8e2ff70e8a","repo":"siyuan-note/siyuan","slug":"upload-failed-s","errorCode":null,"errorMessage":"Upload failed: %s","messagePattern":"Upload failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/assets.go","lineNumber":1384,"sourceCode":"\t\t\tSetSuccessResult(requestResult).\n\t\t\tSetFile(\"file[]\", absAsset).\n\t\t\tSetCookies(&http.Cookie{Name: \"symphony\", Value: uploadToken}).\n\t\t\tSetHeader(\"meta-type\", metaType).\n\t\t\tSetHeader(\"biz-type\", bizType).\n\t\t\tPost(util.GetCloudServer() + \"/apis/siyuan/upload?ver=\" + util.Ver)\n\t\tif nil != reqErr {\n\t\t\tlogging.LogErrorf(\"upload assets failed: %s\", reqErr)\n\t\t\treturn count, ErrFailedToConnectCloudServer\n\t\t}\n\n\t\tif 401 == resp.StatusCode {\n\t\t\terr = errors.New(Conf.Language(31))\n\t\t\treturn\n\t\t}\n\n\t\tif 0 != requestResult.Code {\n\t\t\tlogging.LogErrorf(\"upload assets failed: %s\", requestResult.Msg)\n\t\t\terr = fmt.Errorf(Conf.Language(94), requestResult.Msg)\n\t\t\treturn\n\t\t}\n\n\t\tabsAsset = filepath.ToSlash(absAsset)\n\t\trelAsset := absAsset[strings.Index(absAsset, \"assets/\"):]\n\t\tcompletedUploadAssets = append(completedUploadAssets, relAsset)\n\t\tlogging.LogInfof(\"uploaded asset [%s]\", relAsset)\n\t\tcount++\n\t}\n\n\tif !ignorePushMsg {\n\t\tutil.PushClearMsg(msgId)\n\t}\n\n\tif 0 < len(completedUploadAssets) {\n\t\tlogging.LogInfof(\"uploaded [%d] assets\", len(completedUploadAssets))\n\t}\n\treturn","sourceCodeStart":1366,"sourceCodeEnd":1402,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/afa823b6b4e4f183511e0bc0a3be93caa94c7c97/kernel/model/assets.go#L1366-L1402","documentation":"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.","triggerScenarios":"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.","commonSituations":"Free-tier cloud storage full; assets near the size limit; account state changes mid-batch.","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"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"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.","preventionTips":["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"],"tags":["cloud","upload","quota","i18n"],"backgroundTag":"cloud-upload-rejected","analyzedSha":"afa823b6b4e4f183511e0bc0a3be93caa94c7c97","analyzedAt":"2026-08-18T17:04:10.865Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}