如何用POST请求向WordPress上传视频?Python实现遇阻求助
解决WordPress REST API上传视频提示“媒体不支持”的问题
问题根源
你的Python代码存在两个核心问题,导致WordPress无法正确识别视频文件:
- 手动设置了
Content-Type和Content-Disposition请求头,和requests处理files参数时自动生成的multipart/form-data头冲突,打乱了文件类型解析逻辑。 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
相关产品推荐
相关产品推荐

