Python的 - 通过JSON

问题描述:

发送文件我试图创建一个使用ws4py实时聊天应用程序(如果有更好的插座库我很想建议),我想要实现的文件传输(特别是.wav文件)在我的应用程序。Python的 - 通过JSON

对于文本聊天消息,我目前使用JSON库来发送序列化的字典在我的套接字上并在任一侧解码它们。事情是这样的

message = raw_input("Message: ") 
payload = {"username": self.username, "message": message} 
payload["type"] = constants.CHAT 
socket.send(json.dumps(payload), False) 

我希望能够为这样我就可以有一个JSON送过来,其中字段一个是.wav文件和数据的其他领域将文件传送做同样的之类的东西的用户名,文件名,fileExtension,...

这是正确的方式来发送文件?如果是这样,我似乎无法弄清楚如何将文件放入JSON字符串以通过电线发送。下面是我想

fh = open('foo.wav', 'rb') 
payload = {} 
payload['content'] = fh.read() 
import json 
js = json.dumps(payload) 

这是错误我得到

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 4-5: invalid continuation byte 

我怎么会去序列化和反序列化包含文件,所以我可以通过套接字发送一个JSON?

我的目标是,一旦这个工作我能有此事务的接收端代码看起来像这样

def received_message(self, received_message): 
    payload = json.loads(received_message) 
    filename = payload['filename'] 
    fileData = payload['content'] 
    fh = open(filename, 'wb') 
    fh.write(fileData) 
    fh.close() 
+0

你可能有畸形的JSON在有效载荷 – Sugar

你需要做的二进制BLOB到的东西,可以表示为一个字符串(不随机控制字符等)。典型的做法是做某种encoding such as base64

import base64 
payload['content'] = base64.b64encode(fh.read()) 

生成二进制数据的十六进制字符串表示形式。

然后在另一面:

fileData = base64.b64decode(payload['content']) 
+0

谢谢!这实际上是完美的 –

+0

不客气!如果它满足该问题,请考虑将其标记为已接受。 – systemjack