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

Python POST请求返回200但文件未上传至目标页面的问题排查

问题排查与解决方案

先解决当前请求返回200但文件未上传的问题

你的代码返回200但文件没出现在目标目录,大概率是Artifactory的上传规则没匹配对,按以下步骤排查:

  1. 修正上传URL
    Artifactory的文件上传通常需要在URL中明确指定目标文件名,而非仅到目录层级。把请求URL改成:
url = 'http://artifact.swf.daimler.com/artifactory/apricotbscqal/build/rusi_delta_lb/dummy.tar'

如果只传目录路径,Artifactory可能仅返回目录级成功响应,但不会实际写入文件。

  1. 补充身份认证
    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)
  1. 完善files参数格式
    Artifactory通常期望表单字段名为file,而非文件名本身,同时指定文件类型更稳妥:
files = {'file': ('dummy.tar', f, 'application/x-tar')}
r = requests.post(url, files=files, auth=auth)
  1. 查看响应详情
    别只依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:03:15