【问题标题】:Upload data as image to Wordpress using Wordpress API使用 Wordpress API 将数据作为图像上传到 Wordpress
【发布时间】:2019-06-10 12:26:21
【问题描述】:

我正在尝试获取图像的 URL,下载它,然后使用 Wordpress API 将其上传到 wordpress。这是我的代码:

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 Cloud Functions 上运行它,所以我无权访问文件系统。因此打开/关闭的过程将不起作用。

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

有没有办法做到这一点?

【问题讨论】:

  • 您要上传的图片类型到底是什么 - PNG? JPG?别的东西?反正这不是Python的问题,需要配置Wordpress实例允许上传这种类型的文件,见wpforms.com/docs/how-to-allow-additional-file-upload-types
  • 它们是默认已支持的 png/jpg 图像。如果我下载文件并将其保存到磁盘然后使用打开,一切正常。有没有办法在不实际保存文件的情况下模拟同样的事情?

标签: python wordpress google-cloud-functions wordpress-rest-api


【解决方案1】:

根据 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) }

我相信这应该可以解决您的问题。

【讨论】:

  • 不幸的是,这会产生与以前相同的 500 错误。 Wordpress 似乎需要这个字节集合没有的文件扩展名:(
  • 文件扩展名(.jpg.png)应该是 Content-Disposition: 标头的一部分,而且看起来你实际上是把它放在那里 - 除非你的 media_url 不是以一个结尾那些扩展?
  • 请求的 Content-Dispostion 为:{'Content-Disposition': 'attachment; filename=img-2611001-m.jpg'}
【解决方案2】:

最终我不得不对原来的功能进行 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)

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多