{"record":{"id":"43b229f6627e6032","repo":"siyuan-note/siyuan","slug":"conf-language-94-localized-upload-failure-messag","errorCode":null,"errorMessage":"Conf.Language(94) (localized upload failure message with server msg)","messagePattern":"Conf\\.Language\\(94\\) \\(localized upload failure message with server msg\\)","errorType":"http","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/assets.go","lineNumber":1493,"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":1475,"sourceCodeEnd":1511,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/kernel/model/assets.go#L1475-L1511","documentation":"After an asset upload HTTP request to the cloud succeeds at the transport level, uploadAssets checks the parsed response body's Code field. A non-zero Code means the server rejected the upload for an application-level reason; the function wraps the server-provided Msg into a localized message via Conf.Language(94) and returns it as err.","triggerScenarios":"Calling the asset upload path (uploadAssets) when the cloud server replies with a JSON body whose code != 0 — e.g. storage quota exceeded, file rejected by server-side rules, or server-side internal error. The server's Msg text is embedded in the returned error.","commonSituations":"Cloud storage quota full; uploading an asset type/size the server rejects; temporary cloud service incidents; account restrictions after subscription changes.","solutions":["Read the server message embedded in the error and address it (most commonly: free up cloud storage quota in Settings - Account).","Retry after confirming the SiYuan cloud service status; transient server errors resolve on retry.","Reduce the number/size of assets uploaded in one batch and retry.","Re-login to the cloud if the error persists, to rule out stale session state."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const res = await fetchPost('/api/asset/uploadCloud', {files});\n  if (res.code !== 0) {\n    // server message embedded in error; surface it and offer quota check\n    showQuotaDialog(res.msg);\n  }\n} catch (e) {\n  showToast(e.message); // contains the server-provided reason\n}","preventionTips":["Monitor cloud storage quota before large asset uploads","Upload assets in smaller batches to reduce server rejections","Check SiYuan cloud service status during incidents","Surface the embedded server message to users instead of a generic retry"],"tags":["cloud","upload","api-error","server-response"],"backgroundTag":"http-error-response","analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}