Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Base64映像发送到服务器,然后从服务器拉入以稍后显示Xamarin_C#_Php_Mysql_Xamarin_Base64 - Fatal编程技术网

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

C# 将Base64映像发送到服务器,然后从服务器拉入以稍后显示Xamarin,c#,php,mysql,xamarin,base64,C#,Php,Mysql,Xamarin,Base64,我是Xamarin Andriod Development的新手。我正在尝试向mySQL服务器数据库发送Base64编码的图像,然后在启动应用程序并显示它时检索数据库中的Base64编码图像。我已经能够显示数据库中的所有其他信息,唯一缺少的是打开应用程序时的图像 我的代码如下所示: 将映像发送到服务器 protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)

我是Xamarin Andriod Development的新手。我正在尝试向mySQL服务器数据库发送Base64编码的图像,然后在启动应用程序并显示它时检索数据库中的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_编码的字符串转换为字节数组

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;



    } 
protectedoverride void OnCreate(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
mListView=findviewbyd(Resource.Id.listView);
mProgressBar=findviewbyd(Resource.Id.progressBar);
mClient=newwebclient();
mUrl=newURI(“MYWEBSITE/GetContacts.php”);
//打电话给客户
mClient.DownloadDataAsync(mUrl);
mClient.DownloadDataCompleted+=mClient\u 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));
    }
ImageView pic=row.findviewbyd(Resource.Id.imgPic);
if(mContacts[position].Image!=null)
{
pic.SetImageBitmap(BitmapFactory.DecodeByteArray(mContacts[position].Image,0,mContacts[position].Image.Length));
}

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

几个问题可能有助于回答这个问题:在什么情况下它不起作用?你有错误吗?或者图像不显示


然而,一开始,看起来您正试图从后台线程从UI进行交互。您可以尝试将代码包装到您的
MCClient\u下载的
方法中吗?

一些问题可能有助于回答这个问题:在什么情况下它不起作用?你有错误吗?或者图像不显示


然而,一开始,看起来您正试图从后台线程从UI进行交互。你能试着用你下载的
MCClient\u中的
方法包装代码吗?

我现在就开始工作了。我将数据库类型更改为中型BLOB而不是VARBINARY,然后在进入数据库的过程中去掉base64_encode(),然后在JSON创建过程中在离开数据库的过程中去掉base64_encode()

我现在开始工作了。我将数据库类型更改为中型BLOB而不是VARBINARY,然后在进入数据库的过程中去掉base64_encode(),然后在JSON创建过程中在离开数据库的过程中去掉base64_encode()

图像不会显示。由于图像不是空的或空的,所以正在从服务器发送信息,但是当图像被解码时,它不会显示,即使其余的信息也会显示。您的意思是运行
//调用客户机mClient.DownloadDataAsync(mUrl);mClient.DownloadDataCompleted+=mClient\u DownloadDataCompleted
在runonuithread中,在后台线程上触发
DownloadDataCompleted
事件。因此,您的
MClient\u DownloadDataCompleted
中的代码需要包装在
RunOnUIThread
中。图像不会显示。由于图像不是空的或空的,所以正在从服务器发送信息,但是当图像被解码时,它不会显示,即使其余的信息也会显示。您的意思是运行
//调用客户机mClient.DownloadDataAsync(mUrl);mClient.DownloadDataCompleted+=mClient\u DownloadDataCompleted
在runonuithread中,在后台线程上触发
DownloadDataCompleted
事件。因此,您的
MClient\u下载数据completed
中的代码需要包装在
RunOnUIThread
中。