正确做法是只初始化一次 upload 实例,后续在 before 回调中动态调用 obj.upload({ url: 'xxx', headers: {...}, xhrFields: { withCredentials: true } }) 传入完整配置,同步更新鉴权信息与跨域设置。
upload.render 不能重复调用切换 URL
反复执行 upload.render() 重建实例,会导致 dom 重复绑定事件、内存泄漏,且已选文件列表直接清空。这不是“切换 url”,而是销毁重装,副作用明显。
正确做法是只初始化一次 upload 实例,后续通过 before 回调动态指定本次上传的地址:
- 在
before函数里调用obj.upload({ url: 'xxx', headers: {...} }),传入完整配置 - 不要只传
url,headers(如Authorization、X-Tenant-ID)必须同步更新,否则新域名鉴权失败 - 若使用了
auto: false,每次手动触发obj.upload()都得重新传headers,它不继承上一次配置
如何根据当前域名自动匹配后端接口
前端通常需按环境或租户动态选 URL,比如:https://api-a.example.com 对应图片服务,https://api-b.example.com 对应文档服务。硬编码或写死判断容易出错。
推荐在 before 中做映射逻辑:
- 用
window.location.hostname或全局变量(如setter.env)识别当前运行环境 - 维护一个映射表,例如:
{ 'dev.example.com': '/api/upload/image', 'prod.example.com': 'https://api.prod/upload' } - 从 localStorage 或 Vuex/Pinia 中读取当前租户 ID,拼接出带租户前缀的 URL(如
`/api/${tenantId}/upload`)
跨域场景下必须同步处理 xhrFields 和 CORS 头
换域名 ≠ 换路径,很可能涉及跨域。此时仅改 url 不够,xhrFields: { withCredentials: true } 必须显式保留,且不能依赖全局 $.ajaxSetup —— upload.render 完全不读它。
常见错误:
- 只改了
url,漏掉xhrFields,导致 Cookie 不发送,后端收不到会话凭证 - 后端没配
Access-Control-Allow-Credentials: true,前端设了也白搭,浏览器直接拦截 - 后端
Access-Control-Allow-Origin写了*,但带凭证时必须指定精确域名,否则报错
headers 动态读取 token 是刚需
如果不同域名对应不同微服务,token 可能不同(比如 JWT 有效期、签发方不同),静态写死 headers: { Authorization: 'Bearer xxx' } 在 render 时就失效了。
务必在 before 里实时获取:
- 从
localStorage.getItem('auth_token')读最新 token - 若用状态管理,从 store 取
state.auth.token - 确保 token 存在且未过期,否则主动跳转登录或刷新 token
URL 切换本身不难,难的是配套的鉴权上下文同步 —— 域名变了,token、租户头、凭证策略都得跟着动,漏一项就 401 或 403。


















