<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://cznwiki.com/index.php?action=history&amp;feed=atom&amp;title=%E5%BE%AE%E4%BB%B6%3APicUpload</id>
	<title>微件:PicUpload - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://cznwiki.com/index.php?action=history&amp;feed=atom&amp;title=%E5%BE%AE%E4%BB%B6%3APicUpload"/>
	<link rel="alternate" type="text/html" href="https://cznwiki.com/index.php?title=%E5%BE%AE%E4%BB%B6:PicUpload&amp;action=history"/>
	<updated>2026-08-02T06:45:22Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://cznwiki.com/index.php?title=%E5%BE%AE%E4%BB%B6:PicUpload&amp;diff=24&amp;oldid=prev</id>
		<title>律Rhyme：​创建页面，内容为“&lt;noinclude&gt;{{Path|微件}}{{#微件:PicUpload}}分类:微件&lt;/noinclude&gt; &lt;includeonly&gt; &lt;div class=&quot;pu-container&quot;&gt;&lt;!-- --&gt;&lt;div class=&quot;pu-form&quot;&gt;&lt;!--     --&gt;&lt;div class=&quot;pu-form__row&quot;&gt;&lt;!--         --&gt;&lt;span class=&quot;pu-form__label&quot;&gt;图片分类 (必填)&lt;/span&gt;&lt;!--         --&gt;&lt;input type=&quot;text&quot; class=&quot;pu-form__input&quot; id=&quot;pu-category&quot; placeholder=&quot;多个分类使用英文逗号,隔开&quot;&gt;&lt;!--     --&gt;&lt;/div&gt;&lt;!--     --&gt;&lt;div class=&quot;pu-form__row&quot;&gt;&lt;!--         --&gt;&lt;span cla…”</title>
		<link rel="alternate" type="text/html" href="https://cznwiki.com/index.php?title=%E5%BE%AE%E4%BB%B6:PicUpload&amp;diff=24&amp;oldid=prev"/>
		<updated>2026-08-02T02:30:54Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;noinclude&amp;gt;{{Path|微件}}{{#微件:PicUpload}}&lt;a href=&quot;/index.php?title=%E5%88%86%E7%B1%BB:%E5%BE%AE%E4%BB%B6&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;分类:微件（页面不存在）&quot;&gt;分类:微件&lt;/a&gt;&amp;lt;/noinclude&amp;gt; &amp;lt;includeonly&amp;gt; &amp;lt;div class=&amp;quot;pu-container&amp;quot;&amp;gt;&amp;lt;!-- --&amp;gt;&amp;lt;div class=&amp;quot;pu-form&amp;quot;&amp;gt;&amp;lt;!--     --&amp;gt;&amp;lt;div class=&amp;quot;pu-form__row&amp;quot;&amp;gt;&amp;lt;!--         --&amp;gt;&amp;lt;span class=&amp;quot;pu-form__label&amp;quot;&amp;gt;图片分类 (必填)&amp;lt;/span&amp;gt;&amp;lt;!--         --&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;pu-form__input&amp;quot; id=&amp;quot;pu-category&amp;quot; placeholder=&amp;quot;多个分类使用英文逗号,隔开&amp;quot;&amp;gt;&amp;lt;!--     --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--     --&amp;gt;&amp;lt;div class=&amp;quot;pu-form__row&amp;quot;&amp;gt;&amp;lt;!--         --&amp;gt;&amp;lt;span cla…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Path|微件}}{{#微件:PicUpload}}[[分类:微件]]&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;pu-container&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;pu-form&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;div class=&amp;quot;pu-form__row&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;span class=&amp;quot;pu-form__label&amp;quot;&amp;gt;图片分类 (必填)&amp;lt;/span&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;pu-form__input&amp;quot; id=&amp;quot;pu-category&amp;quot; placeholder=&amp;quot;多个分类使用英文逗号,隔开&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;div class=&amp;quot;pu-form__row&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;span class=&amp;quot;pu-form__label&amp;quot;&amp;gt;来源 (必填)&amp;lt;/span&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;select class=&amp;quot;pu-form__select&amp;quot; id=&amp;quot;pu-source&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;option value=&amp;quot;datamine&amp;quot;&amp;gt;datamine&amp;lt;/option&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;option value=&amp;quot;official&amp;quot;&amp;gt;official&amp;lt;/option&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;div class=&amp;quot;pu-form__row&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;span class=&amp;quot;pu-form__label&amp;quot;&amp;gt;是否编辑 (选填)&amp;lt;/span&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;select class=&amp;quot;pu-form__select&amp;quot; id=&amp;quot;pu-isedited&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;不填&amp;lt;/option&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;option value=&amp;quot;是&amp;quot;&amp;gt;是&amp;lt;/option&amp;gt;&amp;lt;!--&lt;br /&gt;
            --&amp;gt;&amp;lt;option value=&amp;quot;否&amp;quot;&amp;gt;否&amp;lt;/option&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;div class=&amp;quot;pu-form__row&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;button class=&amp;quot;pu-btn pu-btn--select&amp;quot; id=&amp;quot;pu-select-btn&amp;quot;&amp;gt;选择图片&amp;lt;/button&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;button class=&amp;quot;pu-btn pu-btn--upload&amp;quot; id=&amp;quot;pu-upload-btn&amp;quot;&amp;gt;开始上传&amp;lt;/button&amp;gt;&amp;lt;!--&lt;br /&gt;
        --&amp;gt;&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;pu-file-input&amp;quot; multiple accept=&amp;quot;image/*&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;pu-log&amp;quot; id=&amp;quot;pu-log&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
/* 容器 */&lt;br /&gt;
.pu-container { box-sizing: border-box; max-width: 800px; padding: 16px; border: 1px solid #a2a9b1; border-radius: 4px; background-color: #f8f9fa; }&lt;br /&gt;
/* 表单区域 */&lt;br /&gt;
.pu-form { display: flex; flex-direction: column; gap: 12px; }&lt;br /&gt;
/* 表单行 */&lt;br /&gt;
.pu-form__row { display: flex; align-items: center; gap: 10px; }&lt;br /&gt;
/* 标签 */&lt;br /&gt;
.pu-form__label { width: 120px; font-size: 14px; color: #202122; font-weight: bold; flex-shrink: 0; }&lt;br /&gt;
/* 输入框与下拉框通用样式 */&lt;br /&gt;
.pu-form__input, .pu-form__select { flex-grow: 1; padding: 6px 8px; border: 1px solid #a2a9b1; border-radius: 2px; font-size: 14px; box-sizing: border-box; }&lt;br /&gt;
/* 按钮 */&lt;br /&gt;
.pu-btn { padding: 6px 12px; border: 1px solid #a2a9b1; border-radius: 2px; background-color: #fff; cursor: pointer; font-size: 14px; line-height: 1.5; }&lt;br /&gt;
.pu-btn:hover { background-color: #eaecf0; }&lt;br /&gt;
/* 选择文件按钮修饰符 */&lt;br /&gt;
.pu-btn--select { border-color: #36c; color: #36c; }&lt;br /&gt;
/* 上传按钮修饰符 */&lt;br /&gt;
.pu-btn--upload { border-color: #36c; background-color: #36c; color: #fff; }&lt;br /&gt;
.pu-btn--upload:disabled { background-color: #a2a9b1; border-color: #a2a9b1; cursor: not-allowed; }&lt;br /&gt;
/* 日志区域 */&lt;br /&gt;
.pu-log { margin-top: 16px; max-height: 200px; overflow-y: auto; border: 1px solid #a2a9b1; border-radius: 2px; background-color: #fff; padding: 8px; box-sizing: border-box; }&lt;br /&gt;
.pu-log__item { padding: 4px 0; font-size: 13px; border-bottom: 1px solid #eaecf0; }&lt;br /&gt;
.pu-log__item:last-child { border-bottom: none; }&lt;br /&gt;
.pu-log__item--success { color: #14866d; }&lt;br /&gt;
.pu-log__item--error { color: #d33; }&lt;br /&gt;
.pu-log__item--info { color: #202122; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
    var fileInput = document.getElementById(&amp;#039;pu-file-input&amp;#039;);&lt;br /&gt;
    var selectBtn = document.getElementById(&amp;#039;pu-select-btn&amp;#039;);&lt;br /&gt;
    var uploadBtn = document.getElementById(&amp;#039;pu-upload-btn&amp;#039;);&lt;br /&gt;
    var logArea = document.getElementById(&amp;#039;pu-log&amp;#039;);&lt;br /&gt;
    var isUploading = false;&lt;br /&gt;
&lt;br /&gt;
    // 选择文件按钮事件&lt;br /&gt;
    selectBtn.addEventListener(&amp;#039;click&amp;#039;, function() {&lt;br /&gt;
        fileInput.click();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // 监听文件选择，更新按钮文字&lt;br /&gt;
    fileInput.addEventListener(&amp;#039;change&amp;#039;, function() {&lt;br /&gt;
        if(fileInput.files.length &amp;gt; 0) {&lt;br /&gt;
            selectBtn.textContent = &amp;#039;已选择 &amp;#039; + fileInput.files.length + &amp;#039; 个文件&amp;#039;;&lt;br /&gt;
        } else {&lt;br /&gt;
            selectBtn.textContent = &amp;#039;选择图片&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // 上传按钮事件&lt;br /&gt;
    uploadBtn.addEventListener(&amp;#039;click&amp;#039;, async function() {&lt;br /&gt;
        if (isUploading) return;&lt;br /&gt;
        if (fileInput.files.length === 0) {&lt;br /&gt;
            alert(&amp;#039;请先选择图片&amp;#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 获取表单数据&lt;br /&gt;
        var category = document.getElementById(&amp;#039;pu-category&amp;#039;).value.trim();&lt;br /&gt;
        var source = document.getElementById(&amp;#039;pu-source&amp;#039;).value;&lt;br /&gt;
        var isEdited = document.getElementById(&amp;#039;pu-isedited&amp;#039;).value;&lt;br /&gt;
&lt;br /&gt;
        // 校验必填项&lt;br /&gt;
        if (!category) {&lt;br /&gt;
            alert(&amp;#039;分类为必填项&amp;#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (!source) {&lt;br /&gt;
            alert(&amp;#039;来源为必填项&amp;#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        isUploading = true;&lt;br /&gt;
        uploadBtn.disabled = true;&lt;br /&gt;
        uploadBtn.textContent = &amp;#039;上传中...&amp;#039;;&lt;br /&gt;
        appendLog(&amp;#039;开始上传任务...&amp;#039;, &amp;#039;info&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        // 获取MediaWiki CSRF Token&lt;br /&gt;
        var token = &amp;#039;&amp;#039;;&lt;br /&gt;
        try {&lt;br /&gt;
            var tokenRes = await fetch(&amp;#039;https://cznwiki.com/api.php?action=query&amp;amp;meta=tokens&amp;amp;type=csrf&amp;amp;format=json&amp;#039;);&lt;br /&gt;
            var tokenData = await tokenRes.json();&lt;br /&gt;
            token = tokenData.query.tokens.csrftoken;&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            appendLog(&amp;#039;获取Token失败，请检查网络或登录状态&amp;#039;, &amp;#039;error&amp;#039;);&lt;br /&gt;
            isUploading = false;&lt;br /&gt;
            uploadBtn.disabled = false;&lt;br /&gt;
            uploadBtn.textContent = &amp;#039;开始上传&amp;#039;;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 遍历文件队列上传&lt;br /&gt;
        for (var i = 0; i &amp;lt; fileInput.files.length; i++) {&lt;br /&gt;
            var file = fileInput.files[i];&lt;br /&gt;
            appendLog(&amp;#039;正在上传: &amp;#039; + file.name, &amp;#039;info&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
            // 构建 WikiText&lt;br /&gt;
            var wikiText = &amp;#039;&amp;#039;;&lt;br /&gt;
            var cats = category.split(&amp;#039;,&amp;#039;);&lt;br /&gt;
            for (var j = 0; j &amp;lt; cats.length; j++) {&lt;br /&gt;
                var cat = cats[j].trim();&lt;br /&gt;
                if (cat) {&lt;br /&gt;
                    wikiText += &amp;#039;[[Category:&amp;#039; + cat + &amp;#039;]]\n&amp;#039;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            wikiText += &amp;#039;\n== 图片信息 ==\n&amp;#039;;&lt;br /&gt;
            wikiText += &amp;#039;* source: &amp;#039; + source + &amp;#039;\n&amp;#039;;&lt;br /&gt;
            if (isEdited) {&lt;br /&gt;
                wikiText += &amp;#039;* isEdited: &amp;#039; + isEdited + &amp;#039;\n&amp;#039;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // 构建 FormData&lt;br /&gt;
            var formData = new FormData();&lt;br /&gt;
            formData.append(&amp;#039;action&amp;#039;, &amp;#039;upload&amp;#039;);&lt;br /&gt;
            formData.append(&amp;#039;filename&amp;#039;, file.name);&lt;br /&gt;
            formData.append(&amp;#039;file&amp;#039;, file);&lt;br /&gt;
            formData.append(&amp;#039;text&amp;#039;, wikiText);&lt;br /&gt;
            formData.append(&amp;#039;token&amp;#039;, token);&lt;br /&gt;
            formData.append(&amp;#039;format&amp;#039;, &amp;#039;json&amp;#039;);&lt;br /&gt;
            formData.append(&amp;#039;ignorewarnings&amp;#039;, &amp;#039;1&amp;#039;); // 覆盖同名文件&lt;br /&gt;
&lt;br /&gt;
            try {&lt;br /&gt;
                var uploadRes = await fetch(&amp;#039;https://cznwiki.com/api.php&amp;#039;, {&lt;br /&gt;
                    method: &amp;#039;POST&amp;#039;,&lt;br /&gt;
                    body: formData&lt;br /&gt;
                });&lt;br /&gt;
                var uploadData = await uploadRes.json();&lt;br /&gt;
&lt;br /&gt;
                if (uploadData.upload &amp;amp;&amp;amp; uploadData.upload.result === &amp;#039;Success&amp;#039;) {&lt;br /&gt;
                    appendLog(&amp;#039;成功: &amp;#039; + file.name, &amp;#039;success&amp;#039;);&lt;br /&gt;
                } else if (uploadData.error) {&lt;br /&gt;
                    appendLog(&amp;#039;失败: &amp;#039; + file.name + &amp;#039; (原因: &amp;#039; + uploadData.error.info + &amp;#039;)&amp;#039;, &amp;#039;error&amp;#039;);&lt;br /&gt;
                } else {&lt;br /&gt;
                    appendLog(&amp;#039;未知结果: &amp;#039; + file.name, &amp;#039;error&amp;#039;);&lt;br /&gt;
                }&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                appendLog(&amp;#039;网络错误: &amp;#039; + file.name, &amp;#039;error&amp;#039;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        isUploading = false;&lt;br /&gt;
        uploadBtn.disabled = false;&lt;br /&gt;
        uploadBtn.textContent = &amp;#039;开始上传&amp;#039;;&lt;br /&gt;
        fileInput.value = &amp;#039;&amp;#039;;&lt;br /&gt;
        selectBtn.textContent = &amp;#039;选择图片&amp;#039;;&lt;br /&gt;
        appendLog(&amp;#039;全部上传任务结束&amp;#039;, &amp;#039;info&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // 日志输出函数&lt;br /&gt;
    function appendLog(msg, type) {&lt;br /&gt;
        var div = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
        div.className = &amp;#039;pu-log__item pu-log__item--&amp;#039; + (type || &amp;#039;info&amp;#039;);&lt;br /&gt;
        div.textContent = msg;&lt;br /&gt;
        logArea.appendChild(div);&lt;br /&gt;
        // 自动滚动到底部&lt;br /&gt;
        logArea.scrollTop = logArea.scrollHeight;&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>律Rhyme</name></author>
	</entry>
</feed>