如何通过json发送base64编码的文件内容,将文件上传内容插入数据库?

How to insert file upload content to database by sending base64 encoded file content via json?

在我的 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 代码中,在您调用 file_get_contents($_FILES['userImage']['tmp_name']) 之后,return 值是一个包含图像内容的字符串,它是 binary 数据。你不应该像这些是真实的字符一样转义这些内容。所以这一行应该只是:

$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 执行 table 插入,这不仅简化了值的传递,而且避免了 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' codec can't decode byte 0xff in position 0: ordinal not in range(128)`

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

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

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