本文目录导读:

- 场景一:通过浏览器控制台上传(如网盘、后台管理系统)
- 场景二:使用命令行脚本(如Github Release、API上传、对象存储)
- 场景三:自动化测试工具(如Selenium、Playwright)
- 总结:哪种适合你?
可以,完全可以实现批量上传。
但“批量上传”的具体实现方式取决于你提到的“实用脚本”指的是什么场景,下面我来拆解几种最常见的批量上传需求,并提供对应的解决方案和脚本思路。
场景一:通过浏览器控制台上传(如网盘、后台管理系统)
这是最常见的需求,如果一个网页的上传界面只允许“选择文件”,但你想一次性传几百个文件。
原理: 通过JavaScript脚本修改文件输入框的值,或触发文件选择器的webkitdirectory属性,甚至模拟拖拽事件。
实用脚本示例(在浏览器F12控制台运行):
// 方案A:最简单的 - 使用 webkitdirectory 属性(支持文件夹上传)
function uploadFolder() {
var input = document.createElement('input');
input.type = 'file';
input.webkitdirectory = true; // 关键属性,允许选择整个文件夹
input.onchange = function(e) {
var files = e.target.files;
console.log('选中了 ' + files.length + ' 个文件');
// 这里需要模拟点击该网站的上传按钮,或者直接提交表单
// 由于每个网站的上传逻辑不同,你需要找到页面上传按钮的ID或class
// document.querySelector('#uploadBtn').click();
};
input.click();
}
uploadFolder();
// 方案B:手动创建一个包含多个文件的 DataTransfer 对象(更复杂,需要适配具体网站的上传API)
// 需要遍历本地文件,这个在浏览器沙箱里无法直接读取本地路径,所以通常方案A更实用
关键点: 大多数网站(如百度网盘、阿里云盘)的上传组件会监听input[type=file]的change事件,你可以先用document.querySelector找到这个隐藏的输入框,然后用脚本修改它的files属性(但出于安全原因,直接修改files属性在很多浏览器中是被禁止的)。更推荐使用webkitdirectory来选择整个文件夹。
场景二:使用命令行脚本(如Github Release、API上传、对象存储)
这是开发者最常用的方式,用Python、Shell或Node.js写一个脚本,循环上传文件。
实用脚本示例(Python):
import os
import requests
# 上传单个文件到某个API
def upload_file(file_path, api_url):
with open(file_path, 'rb') as f:
files = {'file': (os.path.basename(file_path), f)}
response = requests.post(api_url, files=files)
if response.status_code == 200:
print(f"成功: {file_path}")
else:
print(f"失败: {file_path} - {response.text}")
# 批量上传指定文件夹下的所有文件
def batch_upload(folder_path, api_url):
for filename in os.listdir(folder_path):
full_path = os.path.join(folder_path, filename)
if os.path.isfile(full_path):
upload_file(full_path, api_url)
if __name__ == "__main__":
batch_upload("./my_files/", "https://your-api.com/upload")
关键点: 你需要知道目标服务器的API接口地址(API_URL),如果涉及认证(如Token),需要在请求头中加上Authorization,对于大文件,可以加入concurrent.futures实现多线程上传,提高速度。
场景三:自动化测试工具(如Selenium、Playwright)
如果你需要模拟人在浏览器里操作,比如登录后,一个一个点“上传按钮”,可以选择文件。
实用脚本示例(Playwright - Python):
from playwright.sync_api import sync_playwright
import os
def batch_upload_with_playwright(folder_path, website_url):
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto(website_url)
# 假设页面上有一个 id 为 "fileInput" 的文件上传框
input_element = page.locator('#fileInput')
# 准备所有文件的绝对路径(用分号隔开,Windows支持)
files = [os.path.abspath(os.path.join(folder_path, f))
for f in os.listdir(folder_path)
if os.path.isfile(os.path.join(folder_path, f))]
# 一次性设置所有文件(Playwright支持多文件上传)
input_element.set_input_files(files)
# 点击上传按钮
page.locator('#uploadBtn').click()
browser.close()
关键点: 这种方法最接近真实用户操作,能绕过一些复杂的JavaScript校验,但速度较慢,且需要根据具体网页的HTML结构调整选择器。
哪种适合你?
| 你的角色 | 推荐方案 | 理由 |
|---|---|---|
| 普通用户(上传到网盘) | 方案1:浏览器控制台脚本 | 无需安装软件,直接在网页上操作,简单快捷。 |
| 开发者/运维(上传到服务器) | 方案2:Python/Shell脚本 | 可控性强、速度快、能处理大量文件、易集成到CI/CD。 |
| 测试人员(需要模拟完整操作) | 方案3:Playwright/Selenium | 能处理复杂的前端交互,如拖拽、进度条、弹窗。 |
最后提醒:
- 安全:不要运行来路不明的脚本。
- 速率:批量上传上百个文件时,建议在循环中加一个
time.sleep(0.5)(半秒延迟),避免被服务器判断为攻击而封IP。 - 并发:如果上传是同一个接口,可以考虑用Python的
ThreadPoolExecutor(线程池)实现并发,速度提升显著。
如果你有更具体的场景(比如想上传到哪个网站,或者用什么语言写脚本),可以告诉我,我可以帮你写一个更针对性的示例。