Python POST请求返回200但文件未上传至目标页面的问题排查
问题排查与解决方案
先解决当前请求返回200但文件未上传的问题
你的代码返回200但文件没出现在目标目录,大概率是Artifactory的上传规则没匹配对,按以下步骤排查:
- 修正上传URL
Artifactory的文件上传通常需要在URL中明确指定目标文件名,而非仅到目录层级。把请求URL改成:
url = 'http://artifact.swf.daimler.com/artifactory/apricotbscqal/build/rusi_delta_lb/dummy.tar'
如果只传目录路径,Artifactory可能仅返回目录级成功响应,但不会实际写入文件。
- 补充身份认证
Artifactory几乎都需要身份验证,即便返回200,也可能是请求通过但无写入权限。给请求添加认证参数:
- 用户名密码认证:
r = requests.post(url, files={'file': f}, auth=('your_username', 'your_password'))
- API Key认证:
headers = {'Authorization': 'Bearer YOUR_API_KEY'} r = requests.post(url, files={'file': f}, headers=headers)
- 完善files参数格式
Artifactory通常期望表单字段名为file,而非文件名本身,同时指定文件类型更稳妥:
files = {'file': ('dummy.tar', f, 'application/x-tar')} r = requests.post(url, files=files, auth=auth)
- 查看响应详情
别只依赖r.ok,打印响应内容获取Artifactory的具体反馈:
print(r.text) # 若为JSON响应 print(r.json())
很多时候返回200,但响应里藏着权限不足、路径不存在等提示。
Python其他文件上传方式
除了requests的POST表单上传,还有这些常用方式:
1. 使用requests的PUT方法(Artifactory推荐)
Artifactory支持直接用PUT上传文件,无需构造表单,逻辑更直接:
import requests url = 'http://artifact.swf.daimler.com/artifactory/apricotbscqal/build/rusi_delta_lb/dummy.tar' auth = ('your_username', 'your_password') with open('dummy.tar', 'rb') as f: r = requests.put(url, data=f, auth=auth) if r.status_code == 201: print("上传成功") else: print(f"失败,状态码:{r.status_code},响应:{r.text}")
2. 使用标准库http.client
无需第三方依赖,直接用Python标准库实现:
import http.client conn = http.client.HTTPConnection('artifact.swf.daimler.com') headers = { 'Authorization': 'Basic YOUR_BASE64_ENCODED_CREDENTIALS' } with open('dummy.tar', 'rb') as f: conn.request('PUT', '/artifactory/apricotbscqal/build/rusi_delta_lb/dummy.tar', f, headers) response = conn.getresponse() print(response.status, response.reason) print(response.read().decode()) conn.close()
注:YOUR_BASE64_ENCODED_CREDENTIALS是username:password经过Base64编码后的字符串。
3. 使用urllib3
比requests更底层的HTTP库,适合需要更精细控制的场景:
import urllib3 http = urllib3.PoolManager() url = 'http://artifact.swf.daimler.com/artifactory/apricotbscqal/build/rusi_delta_lb/dummy.tar' headers = { 'Authorization': 'Bearer YOUR_API_KEY' } with open('dummy.tar', 'rb') as f: response = http.request('PUT', url, body=f, headers=headers) print(response.status) print(response.data.decode())
内容的提问来源于stack exchange,提问作者LM10
相关产品推荐
相关产品推荐

