如何从 python CGI 脚本中的 POST 数据中获取文件?

How to get a file from POST data in python CGI script?

我正在尝试使用 cURL 上传文件并通过 CGI Python3 脚本从另一端检索它并使用相同的名称保存它。

我当前的 cURL 请求:

curl -X POST --data-binary @file.xlsx http://10.0.0.1/cgi-bin/test.py

如何处理这个文件 python 脚本端?

在您的情况下,您必须从“stdin”读取二进制数据,这将针对 sys.stdin.buffer 发出读取,其中 returns 字节:

#!/usr/bin/env python3
import cgi
import cgitb
import sys

cgitb.enable()

data = sys.stdin.buffer.read()
with open(`file.xlsx`, 'wb') as f:
    f.write(data)
print('Content-Type: text/plain\r\n\r\n', end='')
print('Success!')

更新

如果要发送(上传)文件其他数据,则需要发送multipart/encoded数据,这意味着您必须使用 curl-F 选项。例如:

curl -X POST -F "file=@file.xlsx" -F "ip=10.0.0.2" 10.0.0.1/cgi-bin/test.py

然后你的 Python 脚本变成:

#!/usr/bin/env python3
import cgi
import cgitb
import os

cgitb.enable()

form = cgi.FieldStorage()
ip = form.getvalue('ip')
fileitem = form['file']
data = fileitem.file.read()
# this is the base name of the file that was uploaded:
filename = os.path.basename(fileitem.filename) # or just use 'file.xlsx' or whatever
with open(filename, 'wb') as f:
    f.write(data)
print('Content-Type: text/plain\r\n\r\n', end='')
print('Success!')