在POST请求中发送多个文件

2 投票
1 回答
2351 浏览
提问于 2025-04-18 15:41

我正在尝试在一个POST请求中发送多个文件。以下是我使用的代码。

orig_src = "./orig_src/"
url = "http://"+server+":"+port+"/my_service"
files = []
for root, dirs, files in os.walk(orig_src):
    for fileName in files:
        if len(files) > 0:
            relDir = os.path.relpath(root, orig_src)
            relFile = os.path.join(relDir, fileName)
            files.append(('srcFile', (fileName, open(orig_src+relFile, 'rb'))))
response = requests.post(url, files = files)

当我尝试这样做时,出现了以下错误:

File "/usr/lib/python2.7/posixpath.py", line 66, in join
if b.startswith('/'):
AttributeError: 'tuple' object has no attribute 'startswith'

你知道错误可能出在哪里吗?之前我使用-F选项创建了一个curl请求,并通过os.system命令运行,那个是没问题的。但现在我无法发送这个POST请求,我哪里出错了呢?

1 个回答

1

你在使用 os.path.join 的时候传入了一个元组,正如错误提示所说的那样(in join)。

你需要给传给 requests 的列表起个更好的名字,因为你在声明它为空列表后又重复使用了 files 这个名字。

  • 首先,你在第3行把 files 定义为空列表
  • 然后,在第4行的循环中,你把 files 定义成了从元组中解包得到的第三个项目。

因为你是在原地修改 files,所以你实际上是把元组添加到了这个列表里。Python 认为你应该明白这一点,最后会遍历这个列表,直到找到第一个元组。在这种情况下,fileName 现在是一个元组,而你把它传给了 os.path.join,但这个函数期待的是一个字符串,而不是元组。

只要把这两个定义中的一个改一下,你就没问题了。

撰写回答