将 Base64 图像发送到服务器,然后从服务器拉取以稍后显示 Xamarin
Sending Base64 Image to server and then pulling from the server to display later Xamarin
我是 Xamarin Andriod 开发的新手。我正在尝试将 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;
}
}
PHP 处理图像并将其作为 VARBINARY
存储到数据库中的代码
$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;
}
}
}
MainActivity.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
方法中吗?
我现在可以使用它了。我将我的数据库类型更改为中型 BLOB 而不是 VARBINARY,然后在进入数据库的途中去掉了 base64_encode(),然后在途中去掉了 base64_encode()在 JSON 创建时退出数据库。
我是 Xamarin Andriod 开发的新手。我正在尝试将 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;
}
}
PHP 处理图像并将其作为 VARBINARY
存储到数据库中的代码 $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;
}
}
}
MainActivity.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
方法中吗?
我现在可以使用它了。我将我的数据库类型更改为中型 BLOB 而不是 VARBINARY,然后在进入数据库的途中去掉了 base64_encode(),然后在途中去掉了 base64_encode()在 JSON 创建时退出数据库。