使用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
相关产品推荐
相关产品推荐

