使用 Octoprint REST API 上传文件

3D打印 八字纹
2021-05-21 03:49:22

我正在尝试使用 Octoprint REST API 上传文件 - 根据此处描述的文档上传文件或创建文件夹似乎是可能的,但我无法弄清楚如何使用 Python 请求库来执行此操作。

目前我正在做的是

 import requests

 def def Upload_File():
       fle={'location':"j:/max.gcode"}
       url='http://localhost:5000/api/files/{}'.format('local')
       payload={'select': 'true','print': 'false' }
       header={'content-type': 'multipart/form-data','X-Api-Key': 'FD550BD4DA2442BA906AD1850539D6DB' }
       response = requests.post(url, files=fle,data=payload,headers=header)
       print(response)

if __name__=='__main__':
    Upload_File()

响应返回状态为 400

我的工作环境是:

  • 在虚拟环境中运行的 Windows 10 和 Octoprint。
1个回答

我在本地安装了octoprint来帮助调试这个问题。

  1. 您的代码片段显示“def def Upload_File”,这是一个语法错误。
  2. 如果你进入 Octoprint,在 Settings -> Logging 下,下载 octoprint.log,你会注意到它说“警告 - 400 POST /api/files/local (::1): No multipart boundary provided”。一个快速的谷歌搜索让我找到了这个 StackOverflow问题,它指出要删除自定义内容类型标头来解决这个问题。
  3. 您实际上需要 open() 文件,并将该值分配给文件对象定义中的“文件”字段,而不仅仅是告诉它它当前在您机器上的位置。此外,您需要在文件对象中提供文件名字段。

我让你的代码片段如下工作,继续将你的 API 密钥交换回它。您需要将 open() 调用指向硬盘驱动器上文件的实际位置,我假设它是 j:/max.gcode,而不是我的,它只是从运行目录中打开 max.gcode脚本。

import requests 

def Upload_File():
   fle={'file': open('max.gcode', 'rb'), 'filename': 'max.gcode'}
   url='http://localhost:5000/api/files/{}'.format('local')
   payload={'select': 'true','print': 'false' }
   header={'X-Api-Key': 'FD550BD4DA2442BA906AD1850539D6DB' }
   response = requests.post(url, files=fle,data=payload,headers=header)
   print(response)

if __name__=='__main__':
   Upload_File()

最后,如果你打算用你的 Octoprint 服务器做很多 REST API 恶作剧,我可以提供一个预构建的库吗?