如何在 Android Studio 中使用 Mariadb/J-Connector 将选定的图片上传到外部 Mariadb?
How to upload a chosen picture to external Mariadb using Mariadb/J-Connector in Android Studio?
我正在为我的毕业论文编写一个应用程序,我的合作伙伴有一个外部 Mariadb。我可以很容易地在 mariadb 上获取和设置数据,但是每当我们尝试上传图片时,我们都会遇到以下问题,我不知道怎么办。
在我的 SetData Kotlin Class 我有以下代码:
val query =
"INSERT INTO Profiles (p_name, notification, unit, p_picture) VALUES ('$nam', $noti, $uni, $pic)"
val stmt: Statement = connect!!.createStatement()
val rs: ResultSet = stmt.executeQuery(query)
为了将所选图片转换为位图,byteArrays & co。我有这些行:
bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, imageUri)
var bos = ByteArrayOutputStream()
bitmap!!.compress(Bitmap.CompressFormat.PNG, 100, bos)
val bArray = bos.toByteArray()
var p_picture: String = Base64.encodeToString(bArray, Base64.DEFAULT)
然后调用我的函数,为已经提到的“查询”传输参数:
setData.setValues(p_name, p_notification, p_unit, p_picture)
在没有图片的情况下工作(在本例中 p_picture 为空)一切正常,数据库有一个 now 实体。但是,如果对所选图片尝试相同的操作,我会在“查询”行中收到以下错误:
2021-02-10 17:11:13.899 5974-5974/com.example.dbtesting E/Error 1: (conn=149) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'nFS9W5McSY8lBsBvccmsItlfr82Y1mTSrKRfs0/6/09jspHZfN0kqzIzLu4OYB9ORJBTD23N7mJk
我已经查看了关于 SOF 的其他问题,但是没有人想要同样的事情,他们总是用 PHP 来做,而我们有一个到外部数据库的“直接”连接。
附带信息:数据库中图片的数据类型是 BLOP。
所以我的问题很简单,我要做什么,语法是否正确。也许其他数据类型?也许做不同的?但老实说,我们不会使用 PHP,因为除了这个额外的小功能,它可以正常工作。
提前致谢!
解决方案是使用 preparedStatements,使用简单的 SQL 注入,就像我在问题中使用的那样,你不会成功。通过使用 preparedStatements,现在可以使用 setBinaryStream 和 getBinaryStream 等函数,并且 can/will 可用于来自外部数据库的 uploading/downloading BLOB。我希望有些人在阅读我的答案时会有所顿悟。 @danblack 的评论对我帮助很大,因为我专注于 preparedStatements 并找到了一些有用的信息。
我正在为我的毕业论文编写一个应用程序,我的合作伙伴有一个外部 Mariadb。我可以很容易地在 mariadb 上获取和设置数据,但是每当我们尝试上传图片时,我们都会遇到以下问题,我不知道怎么办。
在我的 SetData Kotlin Class 我有以下代码:
val query =
"INSERT INTO Profiles (p_name, notification, unit, p_picture) VALUES ('$nam', $noti, $uni, $pic)"
val stmt: Statement = connect!!.createStatement()
val rs: ResultSet = stmt.executeQuery(query)
为了将所选图片转换为位图,byteArrays & co。我有这些行:
bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, imageUri)
var bos = ByteArrayOutputStream()
bitmap!!.compress(Bitmap.CompressFormat.PNG, 100, bos)
val bArray = bos.toByteArray()
var p_picture: String = Base64.encodeToString(bArray, Base64.DEFAULT)
然后调用我的函数,为已经提到的“查询”传输参数:
setData.setValues(p_name, p_notification, p_unit, p_picture)
在没有图片的情况下工作(在本例中 p_picture 为空)一切正常,数据库有一个 now 实体。但是,如果对所选图片尝试相同的操作,我会在“查询”行中收到以下错误:
2021-02-10 17:11:13.899 5974-5974/com.example.dbtesting E/Error 1: (conn=149) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'nFS9W5McSY8lBsBvccmsItlfr82Y1mTSrKRfs0/6/09jspHZfN0kqzIzLu4OYB9ORJBTD23N7mJk
我已经查看了关于 SOF 的其他问题,但是没有人想要同样的事情,他们总是用 PHP 来做,而我们有一个到外部数据库的“直接”连接。
附带信息:数据库中图片的数据类型是 BLOP。
所以我的问题很简单,我要做什么,语法是否正确。也许其他数据类型?也许做不同的?但老实说,我们不会使用 PHP,因为除了这个额外的小功能,它可以正常工作。
提前致谢!
解决方案是使用 preparedStatements,使用简单的 SQL 注入,就像我在问题中使用的那样,你不会成功。通过使用 preparedStatements,现在可以使用 setBinaryStream 和 getBinaryStream 等函数,并且 can/will 可用于来自外部数据库的 uploading/downloading BLOB。我希望有些人在阅读我的答案时会有所顿悟。 @danblack 的评论对我帮助很大,因为我专注于 preparedStatements 并找到了一些有用的信息。