如何从 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!')
我正在尝试使用 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!')