<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:BatchUpload?action=history&amp;feed=atom</id>
	<title>微件:BatchUpload - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:BatchUpload?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:BatchUpload?action=history"/>
	<updated>2026-06-14T02:27:14Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;diff=4600&amp;oldid=prev</id>
		<title>2026年6月12日 (五) 12:25 愤怒的郎朗</title>
		<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;diff=4600&amp;oldid=prev"/>
		<updated>2026-06-12T12:25:31Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;amp;diff=4600&amp;amp;oldid=4386&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>愤怒的郎朗</name></author>
	</entry>
	<entry>
		<id>https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;diff=4386&amp;oldid=prev</id>
		<title>2026年6月11日 (四) 12:43 愤怒的郎朗</title>
		<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;diff=4386&amp;oldid=prev"/>
		<updated>2026-06-11T12:43:07Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;amp;diff=4386&amp;amp;oldid=4209&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>愤怒的郎朗</name></author>
	</entry>
	<entry>
		<id>https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;diff=4209&amp;oldid=prev</id>
		<title>2026年6月10日 (三) 11:39 愤怒的郎朗</title>
		<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;diff=4209&amp;oldid=prev"/>
		<updated>2026-06-10T11:39:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;amp;diff=4209&amp;amp;oldid=4207&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>愤怒的郎朗</name></author>
	</entry>
	<entry>
		<id>https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;diff=4207&amp;oldid=prev</id>
		<title>愤怒的郎朗：​创建页面，内容为“&lt;includeonly&gt; &lt;style&gt; .batch-upload-container {     margin: 20px 0;     padding: 20px;     border: 2px dashed #ccc;     border-radius: 12px;     text-align: center;     background: #fafafa; } .batch-upload-container.dragover {     border-color: #4CAF50;     background: #f0fff0; } .batch-upload-input {     display: none; } .batch-upload-btn {     display: inline-block;     padding: 10px 30px;     background: #4CAF50;     color: #fff;     border: none;     border…”</title>
		<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:BatchUpload&amp;diff=4207&amp;oldid=prev"/>
		<updated>2026-06-10T11:30:31Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;includeonly&amp;gt; &amp;lt;style&amp;gt; .batch-upload-container {     margin: 20px 0;     padding: 20px;     border: 2px dashed #ccc;     border-radius: 12px;     text-align: center;     background: #fafafa; } .batch-upload-container.dragover {     border-color: #4CAF50;     background: #f0fff0; } .batch-upload-input {     display: none; } .batch-upload-btn {     display: inline-block;     padding: 10px 30px;     background: #4CAF50;     color: #fff;     border: none;     border…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.batch-upload-container {&lt;br /&gt;
    margin: 20px 0;&lt;br /&gt;
    padding: 20px;&lt;br /&gt;
    border: 2px dashed #ccc;&lt;br /&gt;
    border-radius: 12px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    background: #fafafa;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-container.dragover {&lt;br /&gt;
    border-color: #4CAF50;&lt;br /&gt;
    background: #f0fff0;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-input {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-btn {&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    padding: 10px 30px;&lt;br /&gt;
    background: #4CAF50;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    border: none;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    font-size: 16px;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    margin: 10px;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-btn:hover {&lt;br /&gt;
    background: #45a049;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-btn:disabled {&lt;br /&gt;
    background: #ccc;&lt;br /&gt;
    cursor: not-allowed;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-list {&lt;br /&gt;
    margin-top: 15px;&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    max-height: 400px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-item {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    padding: 8px 12px;&lt;br /&gt;
    border-bottom: 1px solid #eee;&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-item .file-info {&lt;br /&gt;
    flex: 1;&lt;br /&gt;
    min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-item .file-original {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    color: #999;&lt;br /&gt;
    word-break: break-all;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-item .file-rename {&lt;br /&gt;
    width: 200px;&lt;br /&gt;
    padding: 4px 8px;&lt;br /&gt;
    border: 1px solid #ccc;&lt;br /&gt;
    border-radius: 4px;&lt;br /&gt;
    font-size: 13px;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-item .file-rename:focus {&lt;br /&gt;
    border-color: #4CAF50;&lt;br /&gt;
    outline: none;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-item .file-status {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    min-width: 60px;&lt;br /&gt;
    text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.status-waiting { color: #999; }&lt;br /&gt;
.status-uploading { color: #2196F3; }&lt;br /&gt;
.status-success { color: #4CAF50; }&lt;br /&gt;
.status-error { color: #f44336; }&lt;br /&gt;
.batch-upload-progress {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 6px;&lt;br /&gt;
    background: #e0e0e0;&lt;br /&gt;
    border-radius: 3px;&lt;br /&gt;
    margin: 15px 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-progress-bar {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background: #4CAF50;&lt;br /&gt;
    border-radius: 3px;&lt;br /&gt;
    transition: width 0.3s;&lt;br /&gt;
    width: 0%;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-summary {&lt;br /&gt;
    margin-top: 10px;&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    color: #555;&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-actions {&lt;br /&gt;
    margin-top: 10px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 10px;&lt;br /&gt;
    flex-wrap: wrap;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-remove {&lt;br /&gt;
    color: #f44336;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 18px;&lt;br /&gt;
    line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-remove:hover {&lt;br /&gt;
    color: #d32f2f;&lt;br /&gt;
}&lt;br /&gt;
.batch-upload-ext {&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
    color: #999;&lt;br /&gt;
    margin-left: 2px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;batch-upload-container&amp;quot; id=&amp;quot;batch-upload-container&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;📤 批量上传图片&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;p style=&amp;quot;color:#888;font-size:14px;&amp;quot;&amp;gt;支持一次选择多张图片，或拖拽图片到此处&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;file&amp;quot; class=&amp;quot;batch-upload-input&amp;quot; id=&amp;quot;batch-upload-input&amp;quot; multiple accept=&amp;quot;image/*&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;batch-upload-actions&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;button class=&amp;quot;batch-upload-btn&amp;quot; id=&amp;quot;batch-upload-select&amp;quot;&amp;gt;选择图片&amp;lt;/button&amp;gt;&lt;br /&gt;
        &amp;lt;button class=&amp;quot;batch-upload-btn&amp;quot; id=&amp;quot;batch-upload-clear&amp;quot;&amp;gt;清空列表&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;batch-upload-progress&amp;quot; id=&amp;quot;batch-upload-progress&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;batch-upload-progress-bar&amp;quot; id=&amp;quot;batch-upload-progress-bar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;batch-upload-list&amp;quot; id=&amp;quot;batch-upload-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;batch-upload-summary&amp;quot; id=&amp;quot;batch-upload-summary&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;button class=&amp;quot;batch-upload-btn&amp;quot; id=&amp;quot;batch-upload-start&amp;quot; disabled&amp;gt;开始上传&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
    var $container = $(&amp;#039;#batch-upload-container&amp;#039;);&lt;br /&gt;
    var $input = $(&amp;#039;#batch-upload-input&amp;#039;);&lt;br /&gt;
    var $selectBtn = $(&amp;#039;#batch-upload-select&amp;#039;);&lt;br /&gt;
    var $clearBtn = $(&amp;#039;#batch-upload-clear&amp;#039;);&lt;br /&gt;
    var $startBtn = $(&amp;#039;#batch-upload-start&amp;#039;);&lt;br /&gt;
    var $list = $(&amp;#039;#batch-upload-list&amp;#039;);&lt;br /&gt;
    var $progress = $(&amp;#039;#batch-upload-progress&amp;#039;);&lt;br /&gt;
    var $progressBar = $(&amp;#039;#batch-upload-progress-bar&amp;#039;);&lt;br /&gt;
    var $summary = $(&amp;#039;#batch-upload-summary&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    var files = [];&lt;br /&gt;
    var uploadedCount = 0;&lt;br /&gt;
    var totalCount = 0;&lt;br /&gt;
    var isUploading = false;&lt;br /&gt;
&lt;br /&gt;
    // 获取文件扩展名&lt;br /&gt;
    function getExt(filename) {&lt;br /&gt;
        var lastDot = filename.lastIndexOf(&amp;#039;.&amp;#039;);&lt;br /&gt;
        return lastDot &amp;gt; -1 ? filename.substring(lastDot) : &amp;#039;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // 获取不带扩展名的文件名&lt;br /&gt;
    function getNameWithoutExt(filename) {&lt;br /&gt;
        var lastDot = filename.lastIndexOf(&amp;#039;.&amp;#039;);&lt;br /&gt;
        return lastDot &amp;gt; -1 ? filename.substring(0, lastDot) : filename;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $selectBtn.click(function() {&lt;br /&gt;
        $input.click();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $input.change(function() {&lt;br /&gt;
        addFiles(this.files);&lt;br /&gt;
        $input.val(&amp;#039;&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $container.on(&amp;#039;dragover&amp;#039;, function(e) {&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $container.addClass(&amp;#039;dragover&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $container.on(&amp;#039;dragleave&amp;#039;, function() {&lt;br /&gt;
        $container.removeClass(&amp;#039;dragover&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $container.on(&amp;#039;drop&amp;#039;, function(e) {&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $container.removeClass(&amp;#039;dragover&amp;#039;);&lt;br /&gt;
        addFiles(e.originalEvent.dataTransfer.files);&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    $clearBtn.click(function() {&lt;br /&gt;
        files = [];&lt;br /&gt;
        renderList();&lt;br /&gt;
        updateStartButton();&lt;br /&gt;
        $summary.hide();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function addFiles(newFiles) {&lt;br /&gt;
        for (var i = 0; i &amp;lt; newFiles.length; i++) {&lt;br /&gt;
            var file = newFiles[i];&lt;br /&gt;
            if (file.type.match(/^image\//)) {&lt;br /&gt;
                // 存储原始文件和目标文件名&lt;br /&gt;
                file._targetName = getNameWithoutExt(file.name);&lt;br /&gt;
                file._ext = getExt(file.name);&lt;br /&gt;
                files.push(file);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        renderList();&lt;br /&gt;
        updateStartButton();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function renderList() {&lt;br /&gt;
        $list.empty();&lt;br /&gt;
        if (files.length === 0) {&lt;br /&gt;
            $list.append(&amp;#039;&amp;lt;p style=&amp;quot;color:#999;text-align:center;&amp;quot;&amp;gt;暂无文件&amp;lt;/p&amp;gt;&amp;#039;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        files.forEach(function(file, index) {&lt;br /&gt;
            var sizeStr = file.size &amp;gt; 1024 * 1024 ? (file.size / (1024 * 1024)).toFixed(1) + &amp;#039; MB&amp;#039; : (file.size / 1024).toFixed(0) + &amp;#039; KB&amp;#039;;&lt;br /&gt;
            var $item = $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;, { class: &amp;#039;batch-upload-item&amp;#039; });&lt;br /&gt;
&lt;br /&gt;
            // 文件信息&lt;br /&gt;
            var $info = $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;, { class: &amp;#039;file-info&amp;#039; });&lt;br /&gt;
            $info.append(&amp;#039;&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;file-rename&amp;quot; value=&amp;quot;&amp;#039; + file._targetName + &amp;#039;&amp;quot; data-index=&amp;quot;&amp;#039; + index + &amp;#039;&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
            $info.append(&amp;#039;&amp;lt;span class=&amp;quot;batch-upload-ext&amp;quot;&amp;gt;&amp;#039; + file._ext + &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;);&lt;br /&gt;
            $info.append(&amp;#039;&amp;lt;div class=&amp;quot;file-original&amp;quot;&amp;gt;原始: &amp;#039; + file.name + &amp;#039; (&amp;#039; + sizeStr + &amp;#039;)&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
            $item.append($info);&lt;br /&gt;
&lt;br /&gt;
            // 状态&lt;br /&gt;
            $item.append(&amp;#039;&amp;lt;span class=&amp;quot;file-status status-waiting&amp;quot; data-index=&amp;quot;&amp;#039; + index + &amp;#039;&amp;quot;&amp;gt;等待上传&amp;lt;/span&amp;gt;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
            // 删除&lt;br /&gt;
            $item.append(&amp;#039;&amp;lt;span class=&amp;quot;batch-upload-remove&amp;quot; data-index=&amp;quot;&amp;#039; + index + &amp;#039;&amp;quot; title=&amp;quot;移除&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
            $list.append($item);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // 绑定改名事件&lt;br /&gt;
        $(&amp;#039;.file-rename&amp;#039;).off(&amp;#039;input&amp;#039;).on(&amp;#039;input&amp;#039;, function() {&lt;br /&gt;
            var idx = parseInt($(this).data(&amp;#039;index&amp;#039;));&lt;br /&gt;
            if (files[idx]) {&lt;br /&gt;
                files[idx]._targetName = $(this).val().trim();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // 绑定删除事件&lt;br /&gt;
        $(&amp;#039;.batch-upload-remove&amp;#039;).off(&amp;#039;click&amp;#039;).click(function() {&lt;br /&gt;
            var idx = parseInt($(this).data(&amp;#039;index&amp;#039;));&lt;br /&gt;
            files.splice(idx, 1);&lt;br /&gt;
            renderList();&lt;br /&gt;
            updateStartButton();&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function updateStartButton() {&lt;br /&gt;
        $startBtn.prop(&amp;#039;disabled&amp;#039;, files.length === 0 || isUploading);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function getEditToken() {&lt;br /&gt;
        return mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function uploadFile(file, index) {&lt;br /&gt;
        return new Promise(function(resolve, reject) {&lt;br /&gt;
            var targetName = (file._targetName || getNameWithoutExt(file.name)) + file._ext;&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;, targetName);&lt;br /&gt;
            formData.append(&amp;#039;file&amp;#039;, file);&lt;br /&gt;
            formData.append(&amp;#039;format&amp;#039;, &amp;#039;json&amp;#039;);&lt;br /&gt;
            formData.append(&amp;#039;token&amp;#039;, getEditToken());&lt;br /&gt;
            formData.append(&amp;#039;ignorewarnings&amp;#039;, &amp;#039;1&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
            $.ajax({&lt;br /&gt;
                url: mw.util.wikiScript(&amp;#039;api&amp;#039;),&lt;br /&gt;
                type: &amp;#039;POST&amp;#039;,&lt;br /&gt;
                data: formData,&lt;br /&gt;
                processData: false,&lt;br /&gt;
                contentType: false,&lt;br /&gt;
                success: function(data) {&lt;br /&gt;
                    if (data.upload &amp;amp;&amp;amp; data.upload.result === &amp;#039;Success&amp;#039;) {&lt;br /&gt;
                        resolve({ success: true, name: targetName });&lt;br /&gt;
                    } else {&lt;br /&gt;
                        var errMsg = &amp;#039;未知错误&amp;#039;;&lt;br /&gt;
                        if (data.upload &amp;amp;&amp;amp; data.upload.warnings) {&lt;br /&gt;
                            errMsg = JSON.stringify(data.upload.warnings);&lt;br /&gt;
                        } else if (data.error) {&lt;br /&gt;
                            errMsg = data.error.info || &amp;#039;未知错误&amp;#039;;&lt;br /&gt;
                        }&lt;br /&gt;
                        resolve({ success: false, name: targetName, error: errMsg });&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                error: function(xhr) {&lt;br /&gt;
                    resolve({ success: false, name: targetName, error: &amp;#039;HTTP &amp;#039; + xhr.status });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $startBtn.click(function() {&lt;br /&gt;
        if (isUploading || files.length === 0) return;&lt;br /&gt;
        isUploading = true;&lt;br /&gt;
        uploadedCount = 0;&lt;br /&gt;
        totalCount = files.length;&lt;br /&gt;
        updateStartButton();&lt;br /&gt;
        $selectBtn.prop(&amp;#039;disabled&amp;#039;, true);&lt;br /&gt;
        $clearBtn.prop(&amp;#039;disabled&amp;#039;, true);&lt;br /&gt;
        $progress.show();&lt;br /&gt;
        $summary.hide();&lt;br /&gt;
        $progressBar.css(&amp;#039;width&amp;#039;, &amp;#039;0%&amp;#039;);&lt;br /&gt;
        $(&amp;#039;.file-rename&amp;#039;).prop(&amp;#039;disabled&amp;#039;, true);&lt;br /&gt;
        $(&amp;#039;.batch-upload-remove&amp;#039;).hide();&lt;br /&gt;
&lt;br /&gt;
        var uploadQueue = Promise.resolve();&lt;br /&gt;
        files.forEach(function(file, index) {&lt;br /&gt;
            uploadQueue = uploadQueue.then(function() {&lt;br /&gt;
                $(&amp;#039;.file-status[data-index=&amp;quot;&amp;#039; + index + &amp;#039;&amp;quot;]&amp;#039;)&lt;br /&gt;
                    .removeClass(&amp;#039;status-waiting&amp;#039;)&lt;br /&gt;
                    .addClass(&amp;#039;status-uploading&amp;#039;)&lt;br /&gt;
                    .text(&amp;#039;上传中...&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
                return uploadFile(file, index).then(function(result) {&lt;br /&gt;
                    uploadedCount++;&lt;br /&gt;
                    var progress = Math.round((uploadedCount / totalCount) * 100);&lt;br /&gt;
                    $progressBar.css(&amp;#039;width&amp;#039;, progress + &amp;#039;%&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
                    if (result.success) {&lt;br /&gt;
                        $(&amp;#039;.file-status[data-index=&amp;quot;&amp;#039; + index + &amp;#039;&amp;quot;]&amp;#039;)&lt;br /&gt;
                            .removeClass(&amp;#039;status-uploading&amp;#039;)&lt;br /&gt;
                            .addClass(&amp;#039;status-success&amp;#039;)&lt;br /&gt;
                            .text(&amp;#039;✅ 成功&amp;#039;);&lt;br /&gt;
                    } else {&lt;br /&gt;
                        $(&amp;#039;.file-status[data-index=&amp;quot;&amp;#039; + index + &amp;#039;&amp;quot;]&amp;#039;)&lt;br /&gt;
                            .removeClass(&amp;#039;status-uploading&amp;#039;)&lt;br /&gt;
                            .addClass(&amp;#039;status-error&amp;#039;)&lt;br /&gt;
                            .text(&amp;#039;❌ 失败&amp;#039;);&lt;br /&gt;
                        console.log(&amp;#039;上传失败:&amp;#039;, result.name, result.error);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        uploadQueue.then(function() {&lt;br /&gt;
            isUploading = false;&lt;br /&gt;
            $selectBtn.prop(&amp;#039;disabled&amp;#039;, false);&lt;br /&gt;
            $clearBtn.prop(&amp;#039;disabled&amp;#039;, false);&lt;br /&gt;
            updateStartButton();&lt;br /&gt;
            var successCount = $(&amp;#039;.status-success&amp;#039;).length;&lt;br /&gt;
            var failCount = $(&amp;#039;.status-error&amp;#039;).length;&lt;br /&gt;
            $summary.show().html(&amp;#039;上传完成！成功 &amp;#039; + successCount + &amp;#039; 张，失败 &amp;#039; + failCount + &amp;#039; 张。&amp;#039;);&lt;br /&gt;
            files = [];&lt;br /&gt;
            // 保留列表显示结果，5 秒后可清空&lt;br /&gt;
            setTimeout(function() {&lt;br /&gt;
                if (files.length === 0 &amp;amp;&amp;amp; !isUploading) {&lt;br /&gt;
                    renderList();&lt;br /&gt;
                    $progress.hide();&lt;br /&gt;
                }&lt;br /&gt;
            }, 5000);&lt;br /&gt;
        });&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>愤怒的郎朗</name></author>
	</entry>
</feed>