php - 使用 VB.net、PHP 和 Java 从 MySQL DB 保存和检索图像
问题描述
我有一个可以从我的数据库存储和检索图像的 VB.net 应用程序。这一切都有效。
然后,我制作了一个可以在手机上运行的 Android 应用程序(Java 语言),以使用 PHP 脚本将图片发送到同一个数据库。这样,用户不必先拍照然后下载到PC。我的问题是在尝试打开用 PHP 存储的图片时出现的......
这就是我在vb中的做法:
Public Function updateDropPics(iDrop As String, fImg As Image, sType As String, sDate As String)
Dim arrImage() As Byte
Dim cmd As New MySqlCommand
Dim Sql As String = ""
Try
Dim mstreamF As New System.IO.MemoryStream()
fImg.Save(mstreamF, System.Drawing.Imaging.ImageFormat.Jpeg)
arrImage = mstreamF.GetBuffer()
mstreamF.Close()
Sql = "UPDATE photos SET Picture_Data= @fImg, Date_Added = @Date
WHERE Drop_ID = @iDrop"
cmd.Connection = MySqlConn
cmd.CommandText = Sql
cmd.Parameters.AddWithValue("@iDrop", iDrop)
cmd.Parameters.AddWithValue("@fImg", arrImage)
cmd.Parameters.AddWithValue("@Date", sDate)
Dim r As Integer
r = cmd.ExecuteNonQuery()
If r > 0 Then
'MsgBox("Record has been Saved!")
Else
MsgBox("No record has been saved!")
End If
cmd.Parameters.Clear()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Return 0
End Function
为了显示图像,我运行了一个 SELECT 语句,然后将数据加载到图像中:
Dim arrImage() As Byte
arrImage = pTable.Rows(0).Item("Picture_Data")
Dim mstream As New System.IO.MemoryStream(arrImage)
OriginalPreviewImage = Image.FromStream(mstream)
正如我所说,这很好用。
在 Android 应用程序中,我将图像发送到 PHP 脚本并将其存储在数据库中,如下所示:
// Attempt 1: Convert to base64
$image_base64 = base64_encode(file_get_contents($_FILES['image']['tmp_name']) );
$image = 'data:image/'.$imageFileType.';base64,'.$image_base64;
//Attempt 2: use the received file directly
//$image = file_get_contents($_FILES['image']['tmp_name']) ;
//Attempt 3: Save thefiletodisk then to db
//$image = file_get_contents($file_path) ;
$query = "INSERT INTO Photos(Picture_Data) values('".$image."')";
mysqli_query($con,$query);
// Upload file
move_uploaded_file($_FILES['image']['tmp_name'],$upload_path.$name.$imageFileType);
(我首先检查记录是否存在,然后根据需要更新或插入。代码未显示)。当我用谷歌搜索时,每个人都说使用 base64,但是当错误出现时,我意识到我没有在 VB 中这样做,所以我并列其他一些选择。记录是在数据库中创建的,我知道图片上传是因为我现在也将它保存到服务器上的一个文件夹中作为测试。当我运行 VB 应用程序时,尝试显示图片时出现以下错误:
参数无效
在这一行:
OriginalPreviewImage = Image.FromStream(mstream)
看来我的 VB 应用程序不喜欢我用 PHP 输入的数据。Image.FromStream 无法打开 PHP 数据。如何让 PHP 将与 VB 相同的格式保存到数据库中?
任何帮助表示赞赏。谢谢你。
解决方案
看起来我解决了我自己的问题。
将我的 PHP 代码更改为以下内容:
$stmt = $con->prepare("INSERT INTO photos (Picture_Data, Drop_ID, File_Path) VALUES(?,?,?)");
$null = NULL;
$stmt->bind_param("bis", $null, $dropId, $file_path);
$stmt->send_long_data(0, file_get_contents($_FILES['image']['tmp_name']));
$stmt->execute();
move_uploaded_file($_FILES['image']['tmp_name'],$file_path);
send_long_data 成功了。
推荐阅读
- c# - Microsoft 身份验证库 - 获取组成员身份
- c# - 我可以将 ContextMenuStrip 上的多个项目绑定到同一个函数吗?
- sql - 甲骨文今年即将生日
- python - 求aiohttp响应/连接关闭行为的解释
- dynamics-crm - Dynamics 365 – 实体 ER 图表 (Visio) 使用 SDK 中的元数据图表控制台
- typescript - 带有模块分辨率的打字稿的开玩笑设置
- php - 在php中显示数组和对象之间的差异
- javafx-8 - 为什么我不能在表中选择?我和其他人一样
- python - 如何创建一个只有一篇文章的页面?
- python - 如何过滤出今天日期在计算日期范围内的对象?