Загрузить данные в виде изображения в Wordpress с помощью Wordpress API - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь взять URL-адрес изображения, загрузить его, а затем загрузить его в WordPress с помощью Wordpress API. Вот мой код:

def upload_media(self, media_url):
    # Get the last path component
    filename = media_url.split('/')[-1]
    response = requests.get(media_url)
    if response.status_code == 200:
        image = Image.open(BytesIO(response.content))
        upload_url = self.__upload_media_url()
        headers = { "Content-Disposition": f'attachment; filename={filename}'}
        files = { 'file': image.tobytes() }
        request = requests.post(upload_url, auth=(self.username, self.password), files=files, headers=headers)
        return request

Каждый раз, когда это происходит с ошибкой:

{'code': 'rest_upload_unknown_error', 'message': 'Sorry, this file type is not permitted for security reasons.', 'data': {'status': 500}}

Первоначально у меня был следующий код, который работал на моей локальной машине. Однако, поскольку я хочу запустить это в облачных функциях Google, у меня нет доступа к файловой системе. Таким образом, процесс открытия / закрытия не будет работать.

def upload_media(self, media_url):
    # Get the last path component
    filename = media_url.split('/')[-1]
    response = requests.get(media_url)
    if response.status_code == 200:
        with open(filename, 'wb') as file:
            file.write(response.content)
        upload_url = self.__upload_media_url()
        headers = { "Content-Disposition": f'attachment; filename={filename}'}
        files = { 'file': open(filename, 'rb')}
        request = requests.post(upload_url, auth=(self.username, self.password), files=files, headers=headers)
        os.remove(filename)
        return request

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

В конечном итоге мне пришлось внести 2 изменения в исходную функцию.

  1. Добавить Content-type: image/jpeg

  2. Использовать data= вместоfile=

Вот рабочая функция, которая не требует открытия / закрытия каких-либо файлов:

def upload_media(self, media_url):
    # Get the last path component
    filename = media_url.split('/')[-1]
    response = requests.get(media_url)
    if response.status_code == 200:
        upload_url = self.__upload_media_url()
        headers = { "Content-Disposition": f"attachment; filename={filename}" , "Content-Type": "image/jpeg" } 
        return requests.post(upload_url, auth=(self.username, self.password), headers=headers, data=response.content)
0 голосов
/ 11 июня 2019

Согласно https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.tobytes image.tobytes() создает данные изображения RAW, а не сжатые данные PNG или JPG, поэтому вы пытаетесь загрузить , а не один из разрешенных типов.

Просто оставьте эту строку:

image = Image.open(BytesIO(response.content))

и затем используйте:

files = { 'file':  BytesIO(response.content) }

Я считаю, что это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...