为什么我不能 return 函数中的图像而不先将其保存到文件中?

Why can't I return an image from a function without saving it into a file first?

我是 Python 和 web2py 的新手,目前正面临一个奇怪的问题。 我的数据库(SQL 服务器)中存储了图像(图片),我正试图在我的网站上显示这些图像。我已经设法访问数据库并将信息带到网页上,但是我在处理图片时遇到了问题。

经过长时间的尝试,我终于找到了我的问题所在,正如我的 "Download" 函数的以下代码所示。如果我尝试从数据库中读取图像并 return 它,网络浏览器就会卡住并且什么都不显示。如果我将图像保存到临时静态文件,然后读取它然后 return 结果,一切正常。

我唯一的猜测是它与变量的范围有关,但我不确定。这是我的代码:

def download():

    cursor = erpDbCnxn.cursor()
    cursor.execute("SELECT Picture FROM KMS_Parts WHERE PartNo = '%s'" % request.args(0))
    row = cursor.fetchone()

    if row:
        dbpic = row.Picture

        f = open ("C:/Users/Udi/Desktop/tmp.jpg", "wb")  ##This is just for the test
        f.write(dbpic)                                   ##This is just for the test
        f.close()                                        ##This is just for the test

        f = open ("C:/Users/Udi/Desktop/tmp.jpg", "rb")  ##This is just for the test
        filepic = f.read()                               ##This is just for the test
        f.close()                                        ##This is just for the test

        return filepic                                   ##Returning dbpic doesn't work
    else:
        return 

在 web2py 中,您不能简单地 return 文件对象,而必须使用 response.stream:

    import cStringIO
    file = cStringIO.StringIO(row.Picture)
    return response.stream(file)

您还可以考虑使用 web2py DAL 并利用其内置功能来存储和检索文件(请参阅 here and here)。

只为想知道最终结果的人: 看起来这已在以下 web2py 版本之一中得到解决。 目前我只是在做 "return dbpic" 并且工作正常。