Загрузка файлов с помощью Octoprint REST API

Я пытаюсь загрузить файл с помощью 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 работают в виртуальной среде.

, 👍2

Обсуждение

FWIW пользователь опубликовал этот идентичный вопрос в сообществе Octoprint., @tedder42


1 ответ


Лучший ответ:

4

Я установил octoprint локально, чтобы помочь устранить эту проблему.

  1. Во фрагменте кода указано "def def Upload_File", что является синтаксической ошибкой.
  2. Если вы зайдете в Octoprint в разделе Настройки -> Ведение журнала и загрузите octoprint.log, вы заметите, что в нем написано "ПРЕДУПРЕЖДЕНИЕ - 400 СООБЩЕНИЙ /api/файлов/локальных (::1): Не указана составная граница". Быстрый поиск в Google привел меня к этому вопросу StackOverflow, в котором говорится, что для устранения этой проблемы необходимо удалить заголовок пользовательского типа содержимого.
  3. На самом деле вам нужно открыть() файл и присвоить это значение полю "файл" в определении объекта fle, а не просто указать ему, где он в данный момент находится на вашем компьютере. Кроме того, вам необходимо указать поле имени файла в объекте fle.

Я заставил ваш фрагмент кода работать, как показано ниже, пошел дальше и вернул в него ваш 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()

Наконец, если вы собираетесь проделать много махинаций с REST API с вашим сервером Octoprint, могу ли я предложить готовую библиотеку?


,

Не уверен, насколько изменился API REST за последние несколько обновлений, но я бы предположил, что он изменился, и эта библиотека не обновлялась в течение года., @Chase Cromwell

Я на самом деле использовал эту библиотеку, чтобы исправить фрагмент кода выше lol. С этим могут возникнуть проблемы, но в целом API - интерфейсы REST, как правило, в основном одинаковы-с точки зрения разработки почти всегда лучше просто добавлять новые функции, а не изменять старые, потому что это меньше нарушает нисходящий код. Я бы пошел против этого только в том случае, если есть фундаментальная проблема со старым материалом, и его нужно полностью переделать., @Nach0z

Удаление пользовательского заголовка типа контента, похоже, работает .теперь все работает гладко, спасибо ..!, @white_ghost