Cherrypy base64图像编码无法按预期工作

时间:2014-03-16 20:51:05

标签: python image base64 cherrypy data-uri

问题:

在过去的几天里,我一直在玩CherryPy但是我仍然在使图像工作时遇到一些麻烦。我可以将上传的图像保存为jpg而不会出现问题,但我无法将其正确转换为base64图像。这是我写的简单服务器:

server.py

#server.py
import os 
import cherrypy #Import framework


frameNumber = 1
lastFrame = ''
lastFrameBase64 = ''

class Root (object):

    def upload(self, myFile, username, password):
        global frameNumber
        global lastFrameBase64
        global lastFrame
        size = 0
        lastFrameBase64 = ''
        lastFrame = ''
        while True:
            data = myFile.file.read(8192)
            if not data:
                break
            size += len(data)
            lastFrame += data
            lastFrameBase64 += data.encode('base64').replace('\n','')


        f = open('/Users/brian/Files/git-repos/learning-cherrypy/tmp_image/lastframe.jpg','w')
        f.write(lastFrame)
        f.close()
        f = open('/Users/brian/Files/git-repos/learning-cherrypy/tmp_image/lastframe.txt','w')
        f.write(lastFrameBase64)
        f.close()

        cherrypy.response.headers['Content-Type'] = 'application/json'
        print "Image received!"
        frameNumber = frameNumber + 1
        out = "{\"status\":\"%s\"}"
        return out % ( "ok" )
    upload.exposed = True

cherrypy.config.update({'server.socket_host': '192.168.1.14',
                        'server.socket_port': 8080,
                       })
if __name__ == '__main__':
    # CherryPy always starts with app.root when trying to map request URIs
    # to objects, so we need to mount a request handler root. A request
    # to '/' will be mapped to HelloWorld().index().
    cherrypy.quickstart(Root())

当我查看lastframe.jpg文件时,图像呈现完美。但是,当我获取lastframe.txt中找到的文本字符串并将正确的数据-URI标识符data:image/jpeg;base64,添加到base64字符串时,我在网页中看到一个损坏的图像图标我试图显示中的图像。

<!DOCTYPE>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <img src="data:image/jpeg;base64,/9....." >
    </body>
</html>

我已经尝试使用另一个脚本将我已经保存的jpg图像转换为数据uri并且它可以工作。我不确定我在服务器示例中做错了什么b / c这段代码给了我一个字符串作为数据 - uri:

工作转换

jpgtxt = open('tmp_image/lastframe.jpg','rb').read().encode('base64').replace('\n','')

f = open("jpg1_b64.txt", "w")
f.write(jpgtxt)
f.close()

所以基本上归结为从data获取的myFile.file.read(8192)变量与从data取得的open('tmp_image/lastframe.jpg','rb')变量的不同之处我读到rb open方法中的mode告诉python将文件读取为二进制文件而不是字符串。 Here's我得到了那个。

摘要

总之,我不太了解python或cherrypy框架,以了解从myFile变量读取时如何存储实际数据以及从输出中读取数据时如何存储数据open()方法。感谢您抽出宝贵时间来研究这个问题。

1 个答案:

答案 0 :(得分:1)

Base64通过获取每3个字节的输入并产生4个字符来工作。但是当输入不是3个字节的倍数时会发生什么?对此进行了特殊处理,将=符号附加到最后。但这应该只发生在文件的末尾,而不是中间。由于您一次读取8192个字节并对其进行编码,而8192不是3的倍数,因此您将生成损坏的输出。

尝试读取8190字节,或者一次读取并编码整个文件。