簡體   English   中英

將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;

        }
    }
}

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進行交互。 你可以嘗試在你的包裹代碼MCClient_Downloaded的方法RunOnUIThread

我現在就開始工作了。 我將我的數據庫類型更改為中等BLOB而不是VARBINARY,然后在進入數據庫的路上擺脫了base64_encode(),然后在JSON創建中從數據庫出來的路上擺脫了base64_encode() 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM