使用Python将wp.uploadFile xmlrpc文件编码为base64

1 投票
1 回答
2702 浏览
提问于 2025-04-17 13:06

我正在尝试在WordPress上使用xmlrpc上传文件。之前我用PHP做过这个,但这次我必须用Python,结果出现了一些问题。

具体来说,上传文件的方法是调用xmlrpc函数wp.uploadFile,详细说明可以在这里找到 http://codex.wordpress.org/XML-RPC_wp#wp.uploadFile,或者使用metaWeblog.newMediaObject。问题出在编码上。我在PHP中使用了一个类来处理这些繁琐的工作,叫做ixr_base64类,显然它能解决这个问题。而在Python中,我尝试导入base64lib并使用它的b64encode函数,但没有成功。

更具体一点,这里是我正在使用的Python代码:

import xmlrpclib
import urllib2
import base64
def get_url_content(url):
    try:
        content = urllib2.urlopen(url)
        return content.read()
    except:
        print 'error!'

file = get_url_content('http://www.legaljuice.com/Fly.jpg')
file = base64.b64decode(file)
server = xmlrpclib.Server('http://localhost/xmlrpc.php')
xarr = ['1', 'admin', 'pass', {'name':'sssaaa.jpg', 'type':'image/jpeg', 'bits':file,    'overwrite':'true'}]
result = server.metaWeblog.newMediaObject(xarr)
print result

结果并没有成功。WordPress那边没有正确解码。我知道这不是WordPress的问题,因为我之前用PHP做过,而且有很多应用程序,无论是安卓、iOS、桌面还是网页,都能通过xmlrpc实现文件上传。

根据我的研究,Python的base64模块提供的数据编码和解码是按照RFC 3548标准进行的,而PHP的base64_encode则是使用RFC 2045第6.8节的标准。现在我卡住了,尝试了很多方法,但都没有效果,最终在WordPress的媒体页面上只看到损坏的文件。

如果你能帮忙,请告诉我。

1 个回答

4

好的,答案在于xmlrpclib这个类。要从Python向WordPress发送base64编码的数据,你需要像这样使用xmlrpclib类:

base64bits = xmlrpclib.Binary(file_content)

然后你只需要把base64bits这个变量添加到你wp.uploadFile的xmlrpc请求中的'bits'参数里。

为了更准确一点,这里有完整的Python代码,展示了应该怎么做:

import xmlrpclib
import urllib2
from datetime import date
import time

def get_url_content(url):
        try:
            content = urllib2.urlopen(url)
            return content.read()
        except:
            print 'error! NOOOOOO!!!'
file_url = 'http://the path to your picture'
extension = file_url.split(".")
leng = extension.__len__()
extension = extension[leng-1]
if (extension=='jpg'):
    xfileType = 'image/jpeg'
elif(extension=='png'):
    xfileType='image/png'
elif(extension=='bmp'):
    xfileType = 'image/bmp'

file = get_url_content(file_url)
file = xmlrpclib.Binary(file)
server = xmlrpclib.Server('http://website.com/xmlrpc.php')
filename = str(date.today())+str(time.strftime('%H:%M:%S'))
mediarray = {'name':filename+'.'+extension, 
             'type':xfileType, 
             'bits':file, 
             'overwrite':'false'}
xarr = ['1', 'USERHERE', 'PASSWORDHERE', mediarray]
result = server.wp.uploadFile(xarr)
print result

撰写回答