将 Base64 映像发送到服务器,然后从服务器拉取以显示稍后的 Xamarin


Sending Base64 Image to server and then pulling from the server to display later Xamarin

我是Xamarin Andriod Development的新手。我正在尝试将 Base64 编码的图像发送到 mySQL 服务器数据库,然后在启动应用程序并显示它时检索数据库中的 Base64 编码图像。我已经能够显示数据库中的所有其他信息,唯一缺少的是打开应用程序时的图像。

我的代码如下所示:

将映像发送到服务器

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        if (resultCode == Result.Ok)
        {
            int contactID = mContacts[(int)mSelectedPic.Tag].ID;
            Stream stream = ContentResolver.OpenInputStream(data.Data);
            mSelectedPic.SetImageBitmap(DecodeBitmapFromStream(data.Data, 150, 150));
            Bitmap bitmap = BitmapFactory.DecodeStream (stream);
            MemoryStream memStream = new MemoryStream ();
            bitmap.Compress (Bitmap.CompressFormat.Webp, 100, memStream);
            byte[] picData = memStream.ToArray ();
            WebClient client = new WebClient ();
            Uri uri = new Uri ("MYWESBITE/UpdateContact.php");
            NameValueCollection parameters = new NameValueCollection ();
            parameters.Add ("Image", Convert.ToBase64String(picData));
            parameters.Add ("ContactID", contactID.ToString());
            client.UploadValuesAsync (uri, parameters);
            client.UploadValuesCompleted += Client_UploadValuesCompleted;
        }
    }

用于处理图像并将其作为 VARBINARY 存储到数据库中的 PHP 代码

    $imgData = base64_encode($mImage);
    $sql = "UPDATE Contact SET ImageBase64 = '$imgData' WHERE ID = '$mContactID'";
    $result = mysql_query($sql, $link);
    if (!$result) {
        echo "DB Error, could not query the database'n";
        echo 'MySQL Error: ' . mysql_error();
        exit;
    }

然后当应用程序打开时,它会调用此 PHP 函数

$sql = "SELECT * FROM Contact";
$result = mysql_query($sql, $link);
if (!$result) {
    echo "DB Error, could not query the database'n";
    echo 'MySQL Error: ' . mysql_error();
    exit;
}
//create an array
$contact_array = array();
while($row =mysql_fetch_assoc($result))
{
$contact_array[] = array("ID" => $row["ID"],
                "Name" => $row["Name"],
                "Number" => $row["Number"],
                "ImageBase64" => base64_encode($row["ImageBase64"])
                );
}
echo json_encode($contact_array);

这显示了如何将base64_encoded字符串转换为字节数组

class Contact
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Number { get; set; }
    public string ImageBase64 { private get; set; }
    public byte [] Image
    {
        get
        {
            if (ImageBase64 != "" && ImageBase64 != null)
            {
                byte[] image = Convert.FromBase64String (ImageBase64);
                return image;
            }
            return null;
        }
    }
}

主要活动.cs

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);
        mListView = FindViewById<ListView>(Resource.Id.listView);
        mProgressBar = FindViewById<ProgressBar> (Resource.Id.progressBar);
        mClient = new WebClient ();
        mUrl = new Uri ("MYWEBSITE/GetContacts.php");
        //Call the Client
        mClient.DownloadDataAsync (mUrl);
        mClient.DownloadDataCompleted += MClient_DownloadDataCompleted;

    } 

然后最后像这样转换为图像

    ImageView pic = row.FindViewById<ImageView>(Resource.Id.imgPic);
    if (mContacts[position].Image != null)
    {
        pic.SetImageBitmap(BitmapFactory.DecodeByteArray(mContacts[position].Image, 0, mContacts[position].Image.Length));
    }

谢谢大家抽出时间,希望能帮我解决这个问题!

有几个问题可能有助于回答这个问题:它在什么时候不起作用?您收到错误吗?还是图像不显示?

但是,看起来您正在尝试从后台线程从 UI 进行交互。您可以尝试在 RunOnUIThread 中将代码包装在 MCClient_Downloaded 方法中吗?

我现在让它工作了。我将数据库类型更改为 Medium BLOB 而不是 VARBINARY,然后在进入数据库的过程中删除了 base64_encode(),然后在 JSON 创建中摆脱了数据库的 base64_encode()。