You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell上传网站文件遇405错误,求解决方案

解决思路

1. 修正请求URI

你的脚本请求的URI是https://site/upload,但表单的action属性明确指向https://site/uploadlog,这是触发405错误的核心原因之一——请求路径错误,服务器不允许在/upload路径使用POST方法。

2. 匹配表单字段名

表单中的文件上传字段名为zipfile,但脚本里用的是FileName,服务器无法识别该字段,需修正:

$body = @{
    "zipfile" = Get-Content $uploadPath -AsByteStream
}

注意:对于ZIP这类二进制文件,必须用-AsByteStream参数读取,否则Get-Content会以文本方式解析,破坏文件内容。

3. 携带表单必填隐藏字段

表单包含_token和MAX_FILE_SIZE两个必填隐藏字段,脚本未携带这些参数会被服务器拒绝:

$body = @{
    "_token" = "asof2TESTNDNwu1u2"
    "MAX_FILE_SIZE" = "2000000"
    "zipfile" = Get-Content $uploadPath -AsByteStream
}

如果_token是动态生成的(比如每次加载页面都会变化),需要先通过Invoke-WebRequest访问上传页面,从HTML中提取最新的_token值。

4. 正确处理multipart/form-data

手动指定-ContentType "multipart/form-data"无法让PowerShell自动生成正确的表单边界,建议使用Invoke-WebRequest的-Form参数,它会自动处理表单编码:

$uri = "https://site/uploadlog"
$uploadPath = "C:\users\me\Desktop\test.zip"
$user = "User"
$pwd = ConvertTo-SecureString 'Password' -AsPlainText -Force
$cred = New-Object Management.Automation.PSCredential ($user, $pwd)

# 构建完整表单数据
$form = @{
    "_token" = "asof2TESTNDNwu1u2"
    "MAX_FILE_SIZE" = "2000000"
    "zipfile" = Get-Item $uploadPath
}

Invoke-WebRequest -Uri $uri -Credential $cred -Method POST -Form $form

5. 验证认证方式

脚本使用-Credential是HTTP基础/摘要认证,但网站可能采用表单认证(需要先登录获取会话Cookie)。如果是这种情况,需先模拟登录保存会话:

# 模拟登录获取会话
$loginUri = "https://site/login"
$loginForm = @{
    username = $user
    password = "Password"
    # 需补充登录页面的_token字段
}
$session = Invoke-WebRequest -Uri $loginUri -Method POST -Form $loginForm -SessionVariable "session"

# 使用会话上传文件
Invoke-WebRequest -Uri $uri -WebSession $session -Method POST -Form $form

6. 排查服务器端限制

若以上步骤无效,需确认:

  • 服务器是否允许POST请求访问/uploadlog路径
  • 是否有防火墙/反向代理拦截了请求
  • 文件大小是否超过MAX_FILE_SIZE限制(2000000字节=2MB)

内容的提问来源于stack exchange,提问作者SySx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:00:55