[{"data":1,"prerenderedAt":1597},["ShallowReactive",2],{"navigation":3,"docs-\u002Fdocs\u002Fapi\u002Fupload":72,"surround-\u002Fdocs\u002Fapi\u002Fupload":1592},[4],{"title":5,"path":6,"stem":7,"children":8,"page":38},"Docs","\u002Fdocs","docs",[9,39],{"title":10,"path":11,"stem":12,"children":13,"page":38},"Guide","\u002Fdocs\u002Fguide","docs\u002F1.guide",[14,18,22,26,30,34],{"title":15,"path":16,"stem":17},"介绍","\u002Fdocs\u002Fguide\u002Fintroduction","docs\u002F1.guide\u002F1.introduction",{"title":19,"path":20,"stem":21},"快速开始","\u002Fdocs\u002Fguide\u002Fquick-start","docs\u002F1.guide\u002F2.quick-start",{"title":23,"path":24,"stem":25},"配置说明","\u002Fdocs\u002Fguide\u002Fconfiguration","docs\u002F1.guide\u002F3.configuration",{"title":27,"path":28,"stem":29},"存储配置","\u002Fdocs\u002Fguide\u002Fstorage","docs\u002F1.guide\u002F4.storage",{"title":31,"path":32,"stem":33},"生产部署","\u002Fdocs\u002Fguide\u002Fdeployment","docs\u002F1.guide\u002F5.deployment",{"title":35,"path":36,"stem":37},"第三方客户端","\u002Fdocs\u002Fguide\u002Fclients","docs\u002F1.guide\u002F6.clients",false,{"title":40,"path":41,"stem":42,"children":43,"page":38},"Api","\u002Fdocs\u002Fapi","docs\u002F2.api",[44,48,52,56,60,64,68],{"title":45,"path":46,"stem":47},"概述","\u002Fdocs\u002Fapi\u002Foverview","docs\u002F2.api\u002F1.overview",{"title":49,"path":50,"stem":51},"认证","\u002Fdocs\u002Fapi\u002Fauthentication","docs\u002F2.api\u002F2.authentication",{"title":53,"path":54,"stem":55},"文件上传","\u002Fdocs\u002Fapi\u002Fupload","docs\u002F2.api\u002F3.upload",{"title":57,"path":58,"stem":59},"文件管理","\u002Fdocs\u002Fapi\u002Ffiles","docs\u002F2.api\u002F4.files",{"title":61,"path":62,"stem":63},"相册","\u002Fdocs\u002Fapi\u002Falbums","docs\u002F2.api\u002F5.albums",{"title":65,"path":66,"stem":67},"API Token","\u002Fdocs\u002Fapi\u002Ftokens","docs\u002F2.api\u002F6.tokens",{"title":69,"path":70,"stem":71},"管理员 API","\u002Fdocs\u002Fapi\u002Fadmin","docs\u002F2.api\u002F7.admin",{"id":73,"title":53,"body":74,"description":1586,"extension":1587,"meta":1588,"navigation":1589,"path":54,"seo":1590,"stem":55,"__hash__":1591},"docs\u002Fdocs\u002F2.api\u002F3.upload.md",{"type":75,"value":76,"toc":1565},"minimark",[77,81,130,142,146,242,245,258,262,343,395,398,648,668,671,762,765,775,786,797,830,833,836,878,881,884,898,915,918,921,924,1007,1017,1020,1031,1039,1045,1048,1051,1053,1097,1101,1157,1161,1221,1225,1546,1549,1561],[78,79,80],"p",{},"Kite 提供两个上传端点：",[82,83,84,99],"table",{},[85,86,87],"thead",{},[88,89,90,94,96],"tr",{},[91,92,93],"th",{},"端点",[91,95,49],{},[91,97,98],{},"适用场景",[100,101,102,117],"tbody",{},[88,103,104,111,114],{},[105,106,107],"td",{},[108,109,110],"code",{},"POST \u002Fapi\u002Fv1\u002Fupload",[105,112,113],{},"Bearer Token",[105,115,116],{},"登录用户、API 客户端",[88,118,119,124,127],{},[105,120,121],{},[108,122,123],{},"POST \u002Fapi\u002Fv1\u002Fpublic\u002Fupload",[105,125,126],{},"无",[105,128,129],{},"游客上传（需管理员开启）",[78,131,132,133,136,137,141],{},"两者均使用 ",[108,134,135],{},"multipart\u002Fform-data","，返回结构与",[138,139,140],"strong",{},"兰空 v2"," 协议一致。",[143,144,145],"h2",{"id":145},"上传处理流程",[147,148,153],"pre",{"className":149,"code":150,"language":151,"meta":152,"style":152},"language-mermaid shiki shiki-themes github-light github-dark","flowchart TD\n  In[接收 multipart\u002Fform-data] --> Auth{是否需要鉴权?}\n  Auth -- \u002Fupload --> Verify[验证 Bearer Token]\n  Auth -- \u002Fpublic\u002Fupload --> Rate[游客速率限制]\n  Verify --> Validate[校验大小\u002F类型]\n  Rate --> Validate\n  Validate --> Hash[计算 MD5]\n  Hash --> Dup{重复文件?}\n  Dup -- 是 --> Reuse[复用已存对象]\n  Dup -- 否 --> Save[写入存储后端]\n  Reuse --> Record[写入文件记录]\n  Save --> Record\n  Record --> Links[生成短链与富文本链接]\n  Links --> Out[返回兰空 v2 响应]\n","mermaid","",[108,154,155,164,170,176,182,188,194,200,206,212,218,224,230,236],{"__ignoreMap":152},[156,157,160],"span",{"class":158,"line":159},"line",1,[156,161,163],{"class":162},"sVt8B","flowchart TD\n",[156,165,167],{"class":158,"line":166},2,[156,168,169],{"class":162},"  In[接收 multipart\u002Fform-data] --> Auth{是否需要鉴权?}\n",[156,171,173],{"class":158,"line":172},3,[156,174,175],{"class":162},"  Auth -- \u002Fupload --> Verify[验证 Bearer Token]\n",[156,177,179],{"class":158,"line":178},4,[156,180,181],{"class":162},"  Auth -- \u002Fpublic\u002Fupload --> Rate[游客速率限制]\n",[156,183,185],{"class":158,"line":184},5,[156,186,187],{"class":162},"  Verify --> Validate[校验大小\u002F类型]\n",[156,189,191],{"class":158,"line":190},6,[156,192,193],{"class":162},"  Rate --> Validate\n",[156,195,197],{"class":158,"line":196},7,[156,198,199],{"class":162},"  Validate --> Hash[计算 MD5]\n",[156,201,203],{"class":158,"line":202},8,[156,204,205],{"class":162},"  Hash --> Dup{重复文件?}\n",[156,207,209],{"class":158,"line":208},9,[156,210,211],{"class":162},"  Dup -- 是 --> Reuse[复用已存对象]\n",[156,213,215],{"class":158,"line":214},10,[156,216,217],{"class":162},"  Dup -- 否 --> Save[写入存储后端]\n",[156,219,221],{"class":158,"line":220},11,[156,222,223],{"class":162},"  Reuse --> Record[写入文件记录]\n",[156,225,227],{"class":158,"line":226},12,[156,228,229],{"class":162},"  Save --> Record\n",[156,231,233],{"class":158,"line":232},13,[156,234,235],{"class":162},"  Record --> Links[生成短链与富文本链接]\n",[156,237,239],{"class":158,"line":238},14,[156,240,241],{"class":162},"  Links --> Out[返回兰空 v2 响应]\n",[143,243,244],{"id":244},"登录用户上传",[246,247,248],"endpoint",{},[78,249,250,251,254,255],{},"POST · ",[108,252,253],{},"\u002Fapi\u002Fv1\u002Fupload"," · ",[138,256,257],{},"需认证",[259,260,261],"h3",{"id":261},"请求",[147,263,267],{"className":264,"code":265,"language":266,"meta":152,"style":152},"language-http shiki shiki-themes github-light github-dark","POST \u002Fapi\u002Fv1\u002Fupload HTTP\u002F1.1\nHost: kite.your-domain.com\nAuthorization: Bearer YOUR_TOKEN\nContent-Type: multipart\u002Fform-data; boundary=...\n\n--boundary\nContent-Disposition: form-data; name=\"file\"; filename=\"photo.jpg\"\nContent-Type: image\u002Fjpeg\n\n\u003Cfile bytes>\n--boundary\nContent-Disposition: form-data; name=\"album_id\"\n\nalbum-uuid\n--boundary--\n","http",[108,268,269,274,279,284,289,295,300,305,310,314,319,323,328,332,337],{"__ignoreMap":152},[156,270,271],{"class":158,"line":159},[156,272,273],{},"POST \u002Fapi\u002Fv1\u002Fupload HTTP\u002F1.1\n",[156,275,276],{"class":158,"line":166},[156,277,278],{},"Host: kite.your-domain.com\n",[156,280,281],{"class":158,"line":172},[156,282,283],{},"Authorization: Bearer YOUR_TOKEN\n",[156,285,286],{"class":158,"line":178},[156,287,288],{},"Content-Type: multipart\u002Fform-data; boundary=...\n",[156,290,291],{"class":158,"line":184},[156,292,294],{"emptyLinePlaceholder":293},true,"\n",[156,296,297],{"class":158,"line":190},[156,298,299],{},"--boundary\n",[156,301,302],{"class":158,"line":196},[156,303,304],{},"Content-Disposition: form-data; name=\"file\"; filename=\"photo.jpg\"\n",[156,306,307],{"class":158,"line":202},[156,308,309],{},"Content-Type: image\u002Fjpeg\n",[156,311,312],{"class":158,"line":208},[156,313,294],{"emptyLinePlaceholder":293},[156,315,316],{"class":158,"line":214},[156,317,318],{},"\u003Cfile bytes>\n",[156,320,321],{"class":158,"line":220},[156,322,299],{},[156,324,325],{"class":158,"line":226},[156,326,327],{},"Content-Disposition: form-data; name=\"album_id\"\n",[156,329,330],{"class":158,"line":232},[156,331,294],{"emptyLinePlaceholder":293},[156,333,334],{"class":158,"line":238},[156,335,336],{},"album-uuid\n",[156,338,340],{"class":158,"line":339},15,[156,341,342],{},"--boundary--\n",[82,344,345,361],{},[85,346,347],{},[88,348,349,352,355,358],{},[91,350,351],{},"字段",[91,353,354],{},"类型",[91,356,357],{},"必填",[91,359,360],{},"说明",[100,362,363,379],{},[88,364,365,370,373,376],{},[105,366,367],{},[108,368,369],{},"file",[105,371,372],{},"文件",[105,374,375],{},"✓",[105,377,378],{},"上传的文件本体",[88,380,381,386,389,392],{},[105,382,383],{},[108,384,385],{},"album_id",[105,387,388],{},"string",[105,390,391],{},"—",[105,393,394],{},"归属相册的 UUID",[259,396,397],{"id":397},"响应",[147,399,403],{"className":400,"code":401,"language":402,"meta":152,"style":152},"language-json shiki shiki-themes github-light github-dark","{\n  \"status\": true,\n  \"message\": \"success\",\n  \"data\": {\n    \"key\": \"2026\u002F04\u002Fa1b2c3d4\u002F01234567-89ab.jpg\",\n    \"name\": \"photo.jpg\",\n    \"origin_name\": \"photo.jpg\",\n    \"size\": 245760,\n    \"mimetype\": \"image\u002Fjpeg\",\n    \"extension\": \"jpg\",\n    \"md5\": \"a1b2c3d4e5f6...\",\n    \"links\": {\n      \"url\": \"https:\u002F\u002Fkite.your-domain.com\u002Fi\u002Fa1b2c3d4\",\n      \"thumbnail_url\": \"https:\u002F\u002Fkite.your-domain.com\u002Ft\u002Fa1b2c3d4\",\n      \"markdown\": \"![photo.jpg](https:\u002F\u002Fkite.your-domain.com\u002Fi\u002Fa1b2c3d4)\",\n      \"html\": \"\u003Cimg src=\\\"https:\u002F\u002Fkite.your-domain.com\u002Fi\u002Fa1b2c3d4\\\" alt=\\\"photo.jpg\\\">\",\n      \"bbcode\": \"[img]https:\u002F\u002Fkite.your-domain.com\u002Fi\u002Fa1b2c3d4[\u002Fimg]\",\n      \"delete_url\": \"https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Ffiles\u002F\u003Cid>\"\n    }\n  }\n}\n","json",[108,404,405,410,425,438,446,458,470,481,493,505,517,529,536,548,560,572,606,619,630,636,642],{"__ignoreMap":152},[156,406,407],{"class":158,"line":159},[156,408,409],{"class":162},"{\n",[156,411,412,416,419,422],{"class":158,"line":166},[156,413,415],{"class":414},"sj4cs","  \"status\"",[156,417,418],{"class":162},": ",[156,420,421],{"class":414},"true",[156,423,424],{"class":162},",\n",[156,426,427,430,432,436],{"class":158,"line":172},[156,428,429],{"class":414},"  \"message\"",[156,431,418],{"class":162},[156,433,435],{"class":434},"sZZnC","\"success\"",[156,437,424],{"class":162},[156,439,440,443],{"class":158,"line":178},[156,441,442],{"class":414},"  \"data\"",[156,444,445],{"class":162},": {\n",[156,447,448,451,453,456],{"class":158,"line":184},[156,449,450],{"class":414},"    \"key\"",[156,452,418],{"class":162},[156,454,455],{"class":434},"\"2026\u002F04\u002Fa1b2c3d4\u002F01234567-89ab.jpg\"",[156,457,424],{"class":162},[156,459,460,463,465,468],{"class":158,"line":190},[156,461,462],{"class":414},"    \"name\"",[156,464,418],{"class":162},[156,466,467],{"class":434},"\"photo.jpg\"",[156,469,424],{"class":162},[156,471,472,475,477,479],{"class":158,"line":196},[156,473,474],{"class":414},"    \"origin_name\"",[156,476,418],{"class":162},[156,478,467],{"class":434},[156,480,424],{"class":162},[156,482,483,486,488,491],{"class":158,"line":202},[156,484,485],{"class":414},"    \"size\"",[156,487,418],{"class":162},[156,489,490],{"class":414},"245760",[156,492,424],{"class":162},[156,494,495,498,500,503],{"class":158,"line":208},[156,496,497],{"class":414},"    \"mimetype\"",[156,499,418],{"class":162},[156,501,502],{"class":434},"\"image\u002Fjpeg\"",[156,504,424],{"class":162},[156,506,507,510,512,515],{"class":158,"line":214},[156,508,509],{"class":414},"    \"extension\"",[156,511,418],{"class":162},[156,513,514],{"class":434},"\"jpg\"",[156,516,424],{"class":162},[156,518,519,522,524,527],{"class":158,"line":220},[156,520,521],{"class":414},"    \"md5\"",[156,523,418],{"class":162},[156,525,526],{"class":434},"\"a1b2c3d4e5f6...\"",[156,528,424],{"class":162},[156,530,531,534],{"class":158,"line":226},[156,532,533],{"class":414},"    \"links\"",[156,535,445],{"class":162},[156,537,538,541,543,546],{"class":158,"line":232},[156,539,540],{"class":414},"      \"url\"",[156,542,418],{"class":162},[156,544,545],{"class":434},"\"https:\u002F\u002Fkite.your-domain.com\u002Fi\u002Fa1b2c3d4\"",[156,547,424],{"class":162},[156,549,550,553,555,558],{"class":158,"line":238},[156,551,552],{"class":414},"      \"thumbnail_url\"",[156,554,418],{"class":162},[156,556,557],{"class":434},"\"https:\u002F\u002Fkite.your-domain.com\u002Ft\u002Fa1b2c3d4\"",[156,559,424],{"class":162},[156,561,562,565,567,570],{"class":158,"line":339},[156,563,564],{"class":414},"      \"markdown\"",[156,566,418],{"class":162},[156,568,569],{"class":434},"\"![photo.jpg](https:\u002F\u002Fkite.your-domain.com\u002Fi\u002Fa1b2c3d4)\"",[156,571,424],{"class":162},[156,573,575,578,580,583,586,589,591,594,596,599,601,604],{"class":158,"line":574},16,[156,576,577],{"class":414},"      \"html\"",[156,579,418],{"class":162},[156,581,582],{"class":434},"\"\u003Cimg src=",[156,584,585],{"class":414},"\\\"",[156,587,588],{"class":434},"https:\u002F\u002Fkite.your-domain.com\u002Fi\u002Fa1b2c3d4",[156,590,585],{"class":414},[156,592,593],{"class":434}," alt=",[156,595,585],{"class":414},[156,597,598],{"class":434},"photo.jpg",[156,600,585],{"class":414},[156,602,603],{"class":434},">\"",[156,605,424],{"class":162},[156,607,609,612,614,617],{"class":158,"line":608},17,[156,610,611],{"class":414},"      \"bbcode\"",[156,613,418],{"class":162},[156,615,616],{"class":434},"\"[img]https:\u002F\u002Fkite.your-domain.com\u002Fi\u002Fa1b2c3d4[\u002Fimg]\"",[156,618,424],{"class":162},[156,620,622,625,627],{"class":158,"line":621},18,[156,623,624],{"class":414},"      \"delete_url\"",[156,626,418],{"class":162},[156,628,629],{"class":434},"\"https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Ffiles\u002F\u003Cid>\"\n",[156,631,633],{"class":158,"line":632},19,[156,634,635],{"class":162},"    }\n",[156,637,639],{"class":158,"line":638},20,[156,640,641],{"class":162},"  }\n",[156,643,645],{"class":158,"line":644},21,[156,646,647],{"class":162},"}\n",[649,650,651],"note",{},[78,652,653,656,657,660,661,660,664,667],{},[138,654,655],{},"字段命名不同于其他接口","：",[108,658,659],{},"status"," \u002F ",[108,662,663],{},"message",[108,665,666],{},"data"," 来自兰空 v2 协议，便于 PicGo、兰空插件直接接入。",[259,669,670],{"id":670},"错误",[82,672,673,686],{},[85,674,675],{},[88,676,677,680,683],{},[91,678,679],{},"HTTP",[91,681,682],{},"Code",[91,684,685],{},"含义",[100,687,688,706,724,747],{},[88,689,690,695,700],{},[105,691,692],{},[108,693,694],{},"400",[105,696,697],{},[108,698,699],{},"40000",[105,701,702,703,705],{},"未提交 ",[108,704,369],{}," 字段",[88,707,708,713,718],{},[105,709,710],{},[108,711,712],{},"413",[105,714,715],{},[108,716,717],{},"41300",[105,719,720,721],{},"文件超出 ",[108,722,723],{},"max_file_size",[88,725,726,731,736],{},[105,727,728],{},[108,729,730],{},"415",[105,732,733],{},[108,734,735],{},"41500",[105,737,738,739,742,743,746],{},"文件类型被禁止（",[108,740,741],{},"forbidden_exts"," 或不在 ",[108,744,745],{},"allowed_types"," 中）",[88,748,749,754,759],{},[105,750,751],{},[108,752,753],{},"507",[105,755,756],{},[108,757,758],{},"50700",[105,760,761],{},"用户存储配额已满",[143,763,764],{"id":764},"游客上传",[246,766,767],{},[78,768,250,769,254,772],{},[108,770,771],{},"\u002Fapi\u002Fv1\u002Fpublic\u002Fupload",[138,773,774],{},"无需认证",[78,776,777,778,781,782,785],{},"仅当管理员开启 ",[108,779,780],{},"allow_guest_upload"," 时可用，并受",[138,783,784],{},"每分钟 10 次","的 IP 速率限制。",[78,787,788,789,792,793,796],{},"请求格式与登录上传相同，只是不需要 ",[108,790,791],{},"Authorization"," 头。上传文件归属虚拟用户 ",[108,794,795],{},"guest","。",[147,798,802],{"className":799,"code":800,"language":801,"meta":152,"style":152},"language-bash shiki shiki-themes github-light github-dark","curl -X POST https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fpublic\u002Fupload \\\n  -F \"file=@photo.png\"\n","bash",[108,803,804,822],{"__ignoreMap":152},[156,805,806,810,813,816,819],{"class":158,"line":159},[156,807,809],{"class":808},"sScJk","curl",[156,811,812],{"class":414}," -X",[156,814,815],{"class":434}," POST",[156,817,818],{"class":434}," https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fpublic\u002Fupload",[156,820,821],{"class":414}," \\\n",[156,823,824,827],{"class":158,"line":166},[156,825,826],{"class":414},"  -F",[156,828,829],{"class":434}," \"file=@photo.png\"\n",[143,831,832],{"id":832},"重复文件处理",[78,834,835],{},"Kite 上传时计算 MD5。当相同 MD5 的文件已存在：",[82,837,838,848],{},[85,839,840],{},[88,841,842,845],{},[91,843,844],{},"设置",[91,846,847],{},"行为",[100,849,850,868],{},[88,851,852,858],{},[105,853,854,857],{},[108,855,856],{},"allow_duplicate = false","（默认）",[105,859,860,861,864,865],{},"复用已有存储文件，为当前用户创建一条新的",[138,862,863],{},"文件记录","，但",[138,866,867],{},"不重复写盘",[88,869,870,875],{},[105,871,872],{},[108,873,874],{},"allow_duplicate = true",[105,876,877],{},"每次都重新写入存储",[78,879,880],{},"这让团队内同一张图可以由多位用户各自「拥有」，同时不占用重复的存储空间。",[143,882,883],{"id":883},"文件访问短链",[78,885,886,887,890,891,894,895,656],{},"上传响应中的 ",[108,888,889],{},"links"," 基于请求的 ",[108,892,893],{},"Host"," 自动生成绝对路径。若在 CDN\u002F反向代理后，",[138,896,897],{},"请确保",[899,900,901,908],"ul",{},[902,903,904,905,907],"li",{},"Nginx 正确转发 ",[108,906,893],{}," 头",[902,909,910,911,914],{},"配置了 ",[108,912,913],{},"X-Forwarded-Proto"," 让 Kite 识别 HTTPS",[78,916,917],{},"否则可能生成错误的 scheme 或域名。",[259,919,920],{"id":920},"访问类型映射",[78,922,923],{},"上传时根据 MIME 自动判定：",[82,925,926,939],{},[85,927,928],{},[88,929,930,933,936],{},[91,931,932],{},"MIME 前缀",[91,934,935],{},"file_type",[91,937,938],{},"默认短链",[100,940,941,958,975,992],{},[88,942,943,948,953],{},[105,944,945],{},[108,946,947],{},"image\u002F*",[105,949,950],{},[108,951,952],{},"image",[105,954,955],{},[108,956,957],{},"\u002Fi\u002F:hash",[88,959,960,965,970],{},[105,961,962],{},[108,963,964],{},"video\u002F*",[105,966,967],{},[108,968,969],{},"video",[105,971,972],{},[108,973,974],{},"\u002Fv\u002F:hash",[88,976,977,982,987],{},[105,978,979],{},[108,980,981],{},"audio\u002F*",[105,983,984],{},[108,985,986],{},"audio",[105,988,989],{},[108,990,991],{},"\u002Fa\u002F:hash",[88,993,994,997,1001],{},[105,995,996],{},"其他",[105,998,999],{},[108,1000,369],{},[105,1002,1003,1006],{},[108,1004,1005],{},"\u002Ff\u002F:hash","（下载）",[78,1008,1009,1010,1012,1013,1016],{},"对所有类型，",[108,1011,1005],{}," 均强制下载（",[108,1014,1015],{},"Content-Disposition: attachment","）。",[143,1018,1019],{"id":1019},"存储路径",[78,1021,1022,1023,1030],{},"存储 key 由 ",[1024,1025,1027],"a",{"href":1026},"\u002Fdocs\u002Fguide\u002Fconfiguration#%E4%B8%8A%E4%BC%A0",[108,1028,1029],{},"path_pattern"," 生成，默认：",[147,1032,1037],{"className":1033,"code":1035,"language":1036},[1034],"language-text","{year}\u002F{month}\u002F{md5_8}\u002F{uuid}.{ext}\n","text",[108,1038,1035],{"__ignoreMap":152},[78,1040,1041,1042],{},"示例：",[108,1043,1044],{},"2026\u002F04\u002Fa1b2c3d4\u002F01234567-89ab-cdef-0123-456789abcdef.jpg",[78,1046,1047],{},"此结构确保前缀分布均匀（对 S3 类存储友好），同时保留年月用于归档。",[143,1049,1050],{"id":1050},"客户端示例",[259,1052,809],{"id":809},[147,1054,1056],{"className":799,"code":1055,"language":801,"meta":152,"style":152},"curl -X POST https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fupload \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  -F \"file=@photo.png\" \\\n  -F \"album_id=optional-uuid\"\n",[108,1057,1058,1071,1081,1090],{"__ignoreMap":152},[156,1059,1060,1062,1064,1066,1069],{"class":158,"line":159},[156,1061,809],{"class":808},[156,1063,812],{"class":414},[156,1065,815],{"class":434},[156,1067,1068],{"class":434}," https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fupload",[156,1070,821],{"class":414},[156,1072,1073,1076,1079],{"class":158,"line":166},[156,1074,1075],{"class":414},"  -H",[156,1077,1078],{"class":434}," \"Authorization: Bearer YOUR_TOKEN\"",[156,1080,821],{"class":414},[156,1082,1083,1085,1088],{"class":158,"line":172},[156,1084,826],{"class":414},[156,1086,1087],{"class":434}," \"file=@photo.png\"",[156,1089,821],{"class":414},[156,1091,1092,1094],{"class":158,"line":178},[156,1093,826],{"class":414},[156,1095,1096],{"class":434}," \"album_id=optional-uuid\"\n",[259,1098,1100],{"id":1099},"javascript-fetch","JavaScript (fetch)",[147,1102,1106],{"className":1103,"code":1104,"language":1105,"meta":152,"style":152},"language-javascript shiki shiki-themes github-light github-dark","const form = new FormData()\nform.append('file', fileInput.files[0])\n\nconst res = await fetch('https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fupload', {\n  method: 'POST',\n  headers: { Authorization: 'Bearer YOUR_TOKEN' },\n  body: form,\n})\nconst { data } = await res.json()\nconsole.log(data.links.url)\n","javascript",[108,1107,1108,1113,1118,1122,1127,1132,1137,1142,1147,1152],{"__ignoreMap":152},[156,1109,1110],{"class":158,"line":159},[156,1111,1112],{},"const form = new FormData()\n",[156,1114,1115],{"class":158,"line":166},[156,1116,1117],{},"form.append('file', fileInput.files[0])\n",[156,1119,1120],{"class":158,"line":172},[156,1121,294],{"emptyLinePlaceholder":293},[156,1123,1124],{"class":158,"line":178},[156,1125,1126],{},"const res = await fetch('https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fupload', {\n",[156,1128,1129],{"class":158,"line":184},[156,1130,1131],{},"  method: 'POST',\n",[156,1133,1134],{"class":158,"line":190},[156,1135,1136],{},"  headers: { Authorization: 'Bearer YOUR_TOKEN' },\n",[156,1138,1139],{"class":158,"line":196},[156,1140,1141],{},"  body: form,\n",[156,1143,1144],{"class":158,"line":202},[156,1145,1146],{},"})\n",[156,1148,1149],{"class":158,"line":208},[156,1150,1151],{},"const { data } = await res.json()\n",[156,1153,1154],{"class":158,"line":214},[156,1155,1156],{},"console.log(data.links.url)\n",[259,1158,1160],{"id":1159},"python-requests","Python (requests)",[147,1162,1166],{"className":1163,"code":1164,"language":1165,"meta":152,"style":152},"language-python shiki shiki-themes github-light github-dark","import requests\n\nfiles = {'file': open('photo.png', 'rb')}\nheaders = {'Authorization': 'Bearer YOUR_TOKEN'}\n\nr = requests.post(\n    'https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fupload',\n    headers=headers,\n    files=files,\n)\nprint(r.json()['data']['links']['url'])\n","python",[108,1167,1168,1173,1177,1182,1187,1191,1196,1201,1206,1211,1216],{"__ignoreMap":152},[156,1169,1170],{"class":158,"line":159},[156,1171,1172],{},"import requests\n",[156,1174,1175],{"class":158,"line":166},[156,1176,294],{"emptyLinePlaceholder":293},[156,1178,1179],{"class":158,"line":172},[156,1180,1181],{},"files = {'file': open('photo.png', 'rb')}\n",[156,1183,1184],{"class":158,"line":178},[156,1185,1186],{},"headers = {'Authorization': 'Bearer YOUR_TOKEN'}\n",[156,1188,1189],{"class":158,"line":184},[156,1190,294],{"emptyLinePlaceholder":293},[156,1192,1193],{"class":158,"line":190},[156,1194,1195],{},"r = requests.post(\n",[156,1197,1198],{"class":158,"line":196},[156,1199,1200],{},"    'https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fupload',\n",[156,1202,1203],{"class":158,"line":202},[156,1204,1205],{},"    headers=headers,\n",[156,1207,1208],{"class":158,"line":208},[156,1209,1210],{},"    files=files,\n",[156,1212,1213],{"class":158,"line":214},[156,1214,1215],{},")\n",[156,1217,1218],{"class":158,"line":220},[156,1219,1220],{},"print(r.json()['data']['links']['url'])\n",[259,1222,1224],{"id":1223},"go","Go",[147,1226,1229],{"className":1227,"code":1228,"language":1223,"meta":152,"style":152},"language-go shiki shiki-themes github-light github-dark","import (\n    \"bytes\"\n    \"mime\u002Fmultipart\"\n    \"net\u002Fhttp\"\n    \"os\"\n)\n\nfunc upload(path, token string) (string, error) {\n    f, _ := os.Open(path)\n    defer f.Close()\n\n    body := &bytes.Buffer{}\n    w := multipart.NewWriter(body)\n    fw, _ := w.CreateFormFile(\"file\", path)\n    io.Copy(fw, f)\n    w.Close()\n\n    req, _ := http.NewRequest(\"POST\",\n        \"https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fupload\", body)\n    req.Header.Set(\"Authorization\", \"Bearer \"+token)\n    req.Header.Set(\"Content-Type\", w.FormDataContentType())\n\n    resp, err := http.DefaultClient.Do(req)\n    \u002F\u002F parse resp.Body...\n}\n",[108,1230,1231,1240,1251,1260,1269,1278,1282,1286,1323,1340,1354,1358,1379,1395,1416,1427,1436,1440,1460,1468,1492,1512,1517,1534,1541],{"__ignoreMap":152},[156,1232,1233,1237],{"class":158,"line":159},[156,1234,1236],{"class":1235},"szBVR","import",[156,1238,1239],{"class":162}," (\n",[156,1241,1242,1245,1248],{"class":158,"line":166},[156,1243,1244],{"class":434},"    \"",[156,1246,1247],{"class":808},"bytes",[156,1249,1250],{"class":434},"\"\n",[156,1252,1253,1255,1258],{"class":158,"line":172},[156,1254,1244],{"class":434},[156,1256,1257],{"class":808},"mime\u002Fmultipart",[156,1259,1250],{"class":434},[156,1261,1262,1264,1267],{"class":158,"line":178},[156,1263,1244],{"class":434},[156,1265,1266],{"class":808},"net\u002Fhttp",[156,1268,1250],{"class":434},[156,1270,1271,1273,1276],{"class":158,"line":184},[156,1272,1244],{"class":434},[156,1274,1275],{"class":808},"os",[156,1277,1250],{"class":434},[156,1279,1280],{"class":158,"line":190},[156,1281,1215],{"class":162},[156,1283,1284],{"class":158,"line":196},[156,1285,294],{"emptyLinePlaceholder":293},[156,1287,1288,1291,1294,1297,1301,1304,1307,1310,1313,1315,1317,1320],{"class":158,"line":202},[156,1289,1290],{"class":1235},"func",[156,1292,1293],{"class":808}," upload",[156,1295,1296],{"class":162},"(",[156,1298,1300],{"class":1299},"s4XuR","path",[156,1302,1303],{"class":162},", ",[156,1305,1306],{"class":1299},"token",[156,1308,1309],{"class":1235}," string",[156,1311,1312],{"class":162},") (",[156,1314,388],{"class":1235},[156,1316,1303],{"class":162},[156,1318,1319],{"class":1235},"error",[156,1321,1322],{"class":162},") {\n",[156,1324,1325,1328,1331,1334,1337],{"class":158,"line":208},[156,1326,1327],{"class":162},"    f, _ ",[156,1329,1330],{"class":1235},":=",[156,1332,1333],{"class":162}," os.",[156,1335,1336],{"class":808},"Open",[156,1338,1339],{"class":162},"(path)\n",[156,1341,1342,1345,1348,1351],{"class":158,"line":214},[156,1343,1344],{"class":1235},"    defer",[156,1346,1347],{"class":162}," f.",[156,1349,1350],{"class":808},"Close",[156,1352,1353],{"class":162},"()\n",[156,1355,1356],{"class":158,"line":220},[156,1357,294],{"emptyLinePlaceholder":293},[156,1359,1360,1363,1365,1368,1370,1373,1376],{"class":158,"line":226},[156,1361,1362],{"class":162},"    body ",[156,1364,1330],{"class":1235},[156,1366,1367],{"class":1235}," &",[156,1369,1247],{"class":808},[156,1371,1372],{"class":162},".",[156,1374,1375],{"class":808},"Buffer",[156,1377,1378],{"class":162},"{}\n",[156,1380,1381,1384,1386,1389,1392],{"class":158,"line":232},[156,1382,1383],{"class":162},"    w ",[156,1385,1330],{"class":1235},[156,1387,1388],{"class":162}," multipart.",[156,1390,1391],{"class":808},"NewWriter",[156,1393,1394],{"class":162},"(body)\n",[156,1396,1397,1400,1402,1405,1408,1410,1413],{"class":158,"line":238},[156,1398,1399],{"class":162},"    fw, _ ",[156,1401,1330],{"class":1235},[156,1403,1404],{"class":162}," w.",[156,1406,1407],{"class":808},"CreateFormFile",[156,1409,1296],{"class":162},[156,1411,1412],{"class":434},"\"file\"",[156,1414,1415],{"class":162},", path)\n",[156,1417,1418,1421,1424],{"class":158,"line":339},[156,1419,1420],{"class":162},"    io.",[156,1422,1423],{"class":808},"Copy",[156,1425,1426],{"class":162},"(fw, f)\n",[156,1428,1429,1432,1434],{"class":158,"line":574},[156,1430,1431],{"class":162},"    w.",[156,1433,1350],{"class":808},[156,1435,1353],{"class":162},[156,1437,1438],{"class":158,"line":608},[156,1439,294],{"emptyLinePlaceholder":293},[156,1441,1442,1445,1447,1450,1453,1455,1458],{"class":158,"line":621},[156,1443,1444],{"class":162},"    req, _ ",[156,1446,1330],{"class":1235},[156,1448,1449],{"class":162}," http.",[156,1451,1452],{"class":808},"NewRequest",[156,1454,1296],{"class":162},[156,1456,1457],{"class":434},"\"POST\"",[156,1459,424],{"class":162},[156,1461,1462,1465],{"class":158,"line":632},[156,1463,1464],{"class":434},"        \"https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fupload\"",[156,1466,1467],{"class":162},", body)\n",[156,1469,1470,1473,1476,1478,1481,1483,1486,1489],{"class":158,"line":638},[156,1471,1472],{"class":162},"    req.Header.",[156,1474,1475],{"class":808},"Set",[156,1477,1296],{"class":162},[156,1479,1480],{"class":434},"\"Authorization\"",[156,1482,1303],{"class":162},[156,1484,1485],{"class":434},"\"Bearer \"",[156,1487,1488],{"class":1235},"+",[156,1490,1491],{"class":162},"token)\n",[156,1493,1494,1496,1498,1500,1503,1506,1509],{"class":158,"line":644},[156,1495,1472],{"class":162},[156,1497,1475],{"class":808},[156,1499,1296],{"class":162},[156,1501,1502],{"class":434},"\"Content-Type\"",[156,1504,1505],{"class":162},", w.",[156,1507,1508],{"class":808},"FormDataContentType",[156,1510,1511],{"class":162},"())\n",[156,1513,1515],{"class":158,"line":1514},22,[156,1516,294],{"emptyLinePlaceholder":293},[156,1518,1520,1523,1525,1528,1531],{"class":158,"line":1519},23,[156,1521,1522],{"class":162},"    resp, err ",[156,1524,1330],{"class":1235},[156,1526,1527],{"class":162}," http.DefaultClient.",[156,1529,1530],{"class":808},"Do",[156,1532,1533],{"class":162},"(req)\n",[156,1535,1537],{"class":158,"line":1536},24,[156,1538,1540],{"class":1539},"sJ8bj","    \u002F\u002F parse resp.Body...\n",[156,1542,1544],{"class":158,"line":1543},25,[156,1545,647],{"class":162},[143,1547,1548],{"id":1548},"下一步",[899,1550,1551,1556],{},[902,1552,1553,1555],{},[1024,1554,57],{"href":58}," · 列表、删除、批量操作",[902,1557,1558,1560],{},[1024,1559,35],{"href":36}," · PicGo 等工具集成",[1562,1563,1564],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":152,"searchDepth":172,"depth":172,"links":1566},[1567,1568,1573,1574,1575,1578,1579,1585],{"id":145,"depth":166,"text":145},{"id":244,"depth":166,"text":244,"children":1569},[1570,1571,1572],{"id":261,"depth":172,"text":261},{"id":397,"depth":172,"text":397},{"id":670,"depth":172,"text":670},{"id":764,"depth":166,"text":764},{"id":832,"depth":166,"text":832},{"id":883,"depth":166,"text":883,"children":1576},[1577],{"id":920,"depth":172,"text":920},{"id":1019,"depth":166,"text":1019},{"id":1050,"depth":166,"text":1050,"children":1580},[1581,1582,1583,1584],{"id":809,"depth":172,"text":809},{"id":1099,"depth":172,"text":1100},{"id":1159,"depth":172,"text":1160},{"id":1223,"depth":172,"text":1224},{"id":1548,"depth":166,"text":1548},"兼容兰空 v2 协议的文件上传接口。","md",{},{"title":53},{"title":53,"description":1586},"GwAsFG3UR4m2-EVu42cMddbW2wwQvTubHon62qTcxYU",[1593,1595],{"title":49,"path":50,"stem":51,"description":1594,"children":-1},"登录、注册、Token 刷新与个人资料接口。",{"title":57,"path":58,"stem":59,"description":1596,"children":-1},"文件列表、详情、删除与批量操作接口。",1776443820550]