首页 > 解决方案 > 使用 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 相同的格式保存到数据库中?

任何帮助表示赞赏。谢谢你。

标签: phpmysql.net

解决方案


看起来我解决了我自己的问题。

将我的 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 成功了。


推荐阅读