You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用POST请求向WordPress上传视频?Python实现遇阻求助

解决WordPress REST API上传视频提示“媒体不支持”的问题

问题根源

你的Python代码存在两个核心问题,导致WordPress无法正确识别视频文件:

  1. 手动设置了Content-Type和Content-Disposition请求头,和requests处理files参数时自动生成的multipart/form-data头冲突,打乱了文件类型解析逻辑。
  2. files参数里的文件Content-Type用了application/octet-stream这个通用二进制类型,WordPress无法将其识别为视频格式。

修正后的本地文件上传代码

import base64
import requests

url = "https://{site}/wp-json/wp/v2/media"
username = ""  # 替换为你的WordPress用户名
password = ""  # 替换为你的WordPress密码

# 生成Basic Auth令牌
token = base64.b64encode(f"{username}:{password}".encode()).decode("utf-8")

payload = {'title': 'test111'}
# 关键:指定视频正确的MIME类型为video/mp4,不要自行设置请求头
files = [
    ('file', ('video123.mp4', open('/Users/{user}/Programming/video123.mp4', 'rb'), 'video/mp4'))
]
headers = {
    "Authorization": f"Basic {token}"
}

response = requests.post(url, headers=headers, data=payload, files=files)

print(response.text)
if response.status_code == 201:
    print("Post created successfully:" + response.text)
    data = response.json()
    print("-----------------------------------------------------------")
    print(f"Link to post: {data['link']} \n ")
else:
    print("Failed to create post: ", response.status_code, response.text)

BytesIO缓冲上传的处理方案

如果用BytesIO传递视频内容,需确保正确指定文件名和MIME类型,示例代码如下:

import io
import base64
import requests

def postWpMedia(title, media_content, status="publish"):
    url = "https://{site}/wp-json/wp/v2/media"
    username = ""
    password = ""
    token = base64.b64encode(f"{username}:{password}".encode()).decode("utf-8")
    
    # 将字节内容封装为文件对象格式,指定文件名和视频MIME类型
    files = [
        ('file', ('video123.mp4', io.BytesIO(media_content), 'video/mp4'))
    ]
    payload = {
        'title': title,
        'status': status
    }
    headers = {
        "Authorization": f"Basic {token}"
    }
    response = requests.post(url, headers=headers, data=payload, files=files)
    return response.json()

# 调用示例(对应你原代码逻辑)
# file_info = await context.bot.get_file(postMediaID)
# file_buffer = io.BytesIO()
# await file_info.download_to_memory(file_buffer)
# result = postWpMedia(title=postTitle, media_content=file_buffer.getvalue(), status=postStatus)

额外注意事项

  • 绝对不要手动设置Content-Type和Content-Disposition请求头,requests会自动处理multipart/form-data格式的请求头。
  • 必须匹配文件真实的MIME类型,比如MP4视频用video/mp4,其他格式如MOV对应video/quicktime。
  • 确认WordPress后台“设置-媒体”中允许上传对应格式的视频,部分主机可能限制了视频文件的上传类型。

内容的提问来源于stack exchange,提问作者ohad guetta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:50:30