【问题标题】:How to insert file upload content to database by sending base64 encoded file content via json?如何通过json发送base64编码的文件内容将文件上传内容插入数据库?
【发布时间】:2021-05-04 02:23:21
【问题描述】:

从我的 php 页面我发送文件上传内容为

$imgData = addslashes(file_get_contents($_FILES['userImage']['tmp_name']));
$imgData= base64_encode($imgData);

然后将其发送到有效负载 - python 中的 REST API

$call->send('{"payload" : { "dbstr" :"' . DEF_DB . '", "tblCode" : "' . USE_INF . '", "use_cod": "'.$use_cod.'", "use_pas": "'.$use_pas.'","use_nam": "'.$use_nam.'","use_dob": "'.$use_dob.'","use_ema": "'.$use_ema.'","use_des": "'.$use_des.'","use_pfe": "'.$imgData.'"}');

然后在我的python代码中我这样写

use_pfe = item_dict['payload']['use_pfe']
imgdata1 = use_pfe.encode("utf-8")
imgdata2 = base64.b64decode(imgdata1)

现在我尝试使用 sql 将其插入到我的数据库中,其中图像列是二进制(blob)类型

cursUserAU.execute("insert into " + tblCode + " (use_cod, use_pass, use_nam, use_dob, use_email, use_desig, use_profile) values ('" + use_cod +"' , '"+ use_pas +"', '"+ use_nam +"', '"+ use_dob +"', '"+ use_ema +"', '"+ use_des +"', "+ imgdata2 +")")

但这以错误告终...我做得对吗?还是缺少任何部分?我不想将此文件保存在任何目录中,我只想将其直接保存在 db 中。请帮助我提出建议或任何资源。提前致谢。

更多详情如下

我正在使用adsdb python驱动连接优势数据库服务器数据库。

在python中

connUserAU = adsdb.connect(DataSource=datasource, ServerType='3', UserID='adssys', Password='')
cursUserAU = connUserAU.cursor()
sql = "insert into " + tblCode + " (use_cod, use_pass, use_nam, use_dob, use_email, use_desig, use_profile) values (?, ?, ?, ?, ?, ?, ?)"
cursUserAU.execute(sql, (use_cod, use_pas, use_nam, use_dob, use_ema, use_des, imgdata))
connUserAU.commit()
cursUserAU.close()

use_profile 之上是 blob 列类型

这里是数据库列类型

use_cod Char( 10 ),
use_pass Char( 10 ),
use_nam Char( 30 ),
use_dob Date,
use_email Char( 50 ),
use_desig Char( 30 ),
use_profile Blob,
user_gender Char( 1 ),
use_profile2 CIChar( 50 )

【问题讨论】:

    标签: php sql json python-2.7 advantage-database-server


    【解决方案1】:

    在您的 PHP 代码中,调用 file_get_contents($_FILES['userImage']['tmp_name']) 后,返回值是一个包含图像内容的字符串,即 二进制 数据。你不应该逃避这个内容,就好像这些是实际的字符一样。所以这一行应该是:

    $imgData = file_get_contents($_FILES['userImage']['tmp_name']);
    

    因此,在您的 Python 代码中,use_pfe 将是 base64 编码的图像。这将是一串 ASCII 字符。线...

    imgdata1 = use_pfe.encode("utf-8")
    

    ... 将use_pfe 转换为使用utf-8 编码的字节字符串。但是,因为这是 Python 2,其中字节字符串与简单字符串相同(即键入 str 而不是 unicode 字符串,即键入 unicode)并且被编码的字符来自ASCII 字符集,可以用单个字节编码,您最终会得到imgdata1use_pfe 相同。实际上,这个语句什么也没做。但是,如果这是 Python 3,其中字节字符串类型为 bytes,不同于字符串类型为 unicode 字符串,类型为 str,则此行将不正确:您需要将输入保留为类型 str next 行的输入,它将 base64 字符串转换回字节字符串。

    把这些放在一起:

    PHP:

    $imgData = file_get_contents($_FILES['userImage']['tmp_name']);
    $imgData = base64_encode($imgData);
    

    Python:

    use_pfe = item_dict['payload']['use_pfe']
    imgdata2 = base64.b64decode(use_pfe)
    

    您应该使用 Prepared Statement 进行表插入,这不仅简化了值的传递,而且还避免了在用户提供值时发生 SQL 注入攻击的可能性。以下参数的占位符是?,我认为这对于您的数据库是正确的(对于 MySql 和 PostgreSQL 以及大多数其他关系数据库,请使用 %s)。

    # make it more readable:
    sql = "insert into " + tblCode + " (use_cod, use_pass, use_nam, use_dob, use_email, use_desig, use_profile) values (?, ?, ?, ?, ?, ?, ?)"
    cursUserAU.execute(sql, (use_cod, use_pas, use_nam, use_dob, use_ema, use_des, imgdata2))
    

    但以上原因导致:

    UnicodeDecodeError:“ascii”编解码器无法解码位置 0 中的字节 0xff:序数不在范围内(128)`

    现在您必须提供表tblCode 中每一列的完整描述,包括正在使用的字符集。此外,打印出每个传递的参数,type(argument) 例如:

    print type(use_cod), type(use_pas), type(use_nam), ... type(imgdata2)
    

    但是为了节省时间,让我问一下问题的最可能原因:您是否对列 use_profile 使用 BLOB 类型?

    【讨论】:

    • 在 python 中我得到这个错误? cursUserAU.execute("插入 " + tblCode + " (use_cod, use_pass, use_nam, use_dob, use_email, use_desig, use_profile,use_profile2) 值 ('" + use_cod +"' , '"+ use_pas +"', '"+ use_nam +"', '"+ use_dob +"', '"+ use_ema +"', '"+ use_des +"', "+ imgdata +", '"+ imageProperties +"')") UnicodeDecodeError: 'ascii'编解码器无法解码位置 0 的字节 0xff:序数不在范围内(128)
    • 我一直在尝试在 Advantage Database Server 上查找文档并发现:根据要求:Python 2.4 或更高版本(请注意,3.x 破坏了某些功能并且不受支持)。好吧,Python 2 是古老的历史;它已经到了“生命的尽头”,没有进一步的支持。
    • 所有其他字段,如字符、日期等,数据插入效果很好。 ADS 仅支持 2.* 版本的 python。
    • 是的 use_profile 是 BLOB 类型(ADS 中的二进制),我试图将图像保存在数据库中,就像我们可以在 mysql 中执行的操作一样,在 blob 文件中插入图像。我错了吗?请纠正我,感谢您帮助我找到解决方案。 @Booboo
    • 我在聊天中添加了一条长评论。等待回复...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2020-02-16
    • 2014-09-28
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多