2015-05-04 58 views
-1

我正在構建一個Android應用程序,該應用程序應該可以拍攝照片,然後將其存儲在數據庫中。我把那部分弄下來了。但是,當我嘗試再次將它加載到我的應用程序中時,這是棘手的問題。Base64對數組中的單個行進行編碼

我的圖像存儲爲longblob在我的數據庫中,我可以從我的logcat中的json讀取中看到longblob正在作爲字符串返回。一個很長的字符串,我無法處理。當我嘗試添加到我的gson創建的包裝類時,它只是給了我一個空指針。

現在,我已經看到了幾個地方,建議我base64_encode它在我的PHP文件。我已經找到了一種方法來做到這一點,但只能通過在php文件中添加另一個數組,並且我想避免在我的java代碼中處理不同的數組。

我的PHP到目前爲止是這樣的:

<?php 
function resultToArray($result) { 
    $rows = array(); 
    while($row = $result->fetch_assoc()) { 
     $rows[] = $row; 

     foreach($rows as $key=>$value){ /* Creating this extra array is what I'm looking to avoid. */ 
      $newArrData[$key] = $spots[$key]; 
      $newArrData[$key]['Image'] = base64_encode($spots[$key]['Image']); 
     } 
    } 
    return $rows; 
} 
$mysqli = new mysqli("host", "username", "password", "db_to_use"); 
$email = $mysqli->real_escape_string($_GET['email']); 
$mysqli->set_charset('utf8'); 
$query = ("SELECT * FROM Cards WHERE Email_FK='{$email}'"); 
$result = $mysqli->query($query); 
$rows = resultToArray($result); 
echo json_encode($rows); 

$result->free(); 
?> 

我回國的9倍不同的值,圖像包括在內。有沒有辦法避免創建newArrData數組,所以我只需要處理我的代碼中的一個?

我的包裝類在Java代碼:

import java.io.Serializable; 

/** 
* Created by KasperG on 22/04/2015. 
*/ 
public class Card implements Serializable { 
    private String Email_FK; 
    private String BarcodeNumbers; 
    private String MemberNumber; 
    private String StoreID; 
    private String CardID; 
    private String HasBarcode; 
    private String StoreName; 
    private String CustomCard; 
    //private Base64 Image; 


    public Card() { 

    } 

    public Card(String barcodeNumbers, String memberNumber, String storeID, String hasBarcode, String cardID, String storeName, String CustomCard) { 
     this.StoreID = storeID; 
     if (barcodeNumbers.isEmpty()) { 
      this.BarcodeNumbers = null; 
     } else { 
      this.BarcodeNumbers = barcodeNumbers; 
     } 
     if (memberNumber.isEmpty()) { 
      this.MemberNumber = null; 
     } else { 
      this.MemberNumber = memberNumber; 
     } 
     this.HasBarcode = hasBarcode; 
     this.CardID = cardID; 
     this.StoreName = storeName; 
     this.CustomCard = CustomCard; 
    } 
    /* 
    public Card(String memberNumber, String storeID) { 
     this.memberNumber = memberNumber; 
     this.storeID = storeID; 
    } 
    */ 

    public String getBarcodeNumbers() { 
     return BarcodeNumbers; 
    } 

    public String getMemberNumber() { 
     return MemberNumber; 
    } 

    public String getHasBarcode() { 
     return HasBarcode; 
    } 

    public String getCardID() { 
     return CardID; 
    } 

    public String getStoreName() { 
     return StoreName; 
    } 

    public int getStoreID() { 
     return Integer.parseInt(StoreID); 
    } 

    public String getCustomStore() { return CustomCard; } 

    //public Base64 getImageString() { return Image; } 


    @Override 
    public String toString() { 
     return "MemberNumber: " + MemberNumber + "\n" + 
       "BarcodeNumbers: " + BarcodeNumbers + "\n" + 
       "Store ID: " + StoreID + "\n" + 
       "Has Barcode " + HasBarcode + "\n" + 
       "Card ID: " + CardID + "\n" + 
       "Store Name: " + StoreName + "\n" + 
       "Custom Card? " + CustomCard + "\n" + 
       "Image String: " /*+ Image*/; 
    } 
} 

「圖像」變量出評論的目的,因爲如果我不這樣做,就好好嘗試在所有的工作!

我在哪裏使用gson從包裝器創建class'es;

public ArrayList<Card> getCards(MyCardsScreenActivity activity) { 
    myCards = activity; 

    String email = SaveSharedPreferences.getUserName(activity); 
    ArrayList<Card> cards = new ArrayList<>(); 
    try { 
     String link = "http://test.wallyy.com/new_get_card_info.php?email=" + email; 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(); 
     request.setURI(new URI(link)); 
     HttpResponse response = client.execute(request); 
     String data = EntityUtils.toString(response.getEntity()); 
     Log.d("Pass3?", data.toString()); 

     Gson gson = new Gson(); 
     Card[] cards1 = gson.fromJson(data.toString(), Card[].class); 
     for(Card card : cards1) { 
      cards.add(card); 
      Log.d("Card toString;\n", card.toString()); 
     } 
    } 
    catch(Exception ex) {} 

    if (!cards.isEmpty()) { 
     myCards.setHasCards(true); 
    } 
    else { 
     myCards.setHasCards(false); 
    } 
    return cards; 
} 

任何人都可以在正確的方向指向我嗎?

編輯: 根據@CJ Wurtz的建議,我改變了我的PHP文件到這個;

while($row = $result->fetch_assoc()) { 
     $row['Image'] = base64_encode($row['Image']); 
     $rows[] = $row; 
    } 

但是,這仍然不能在Android端工作。更新我的包裝類到這個;

public class Card implements Serializable { 
    private String Email_FK; 
    private String BarcodeNumbers; 
    private String MemberNumber; 
    private String StoreID; 
    private String CardID; 
    private String HasBarcode; 
    private String StoreName; 
    private String CustomCard; 
    private Base64 Image; 


    public Card() { 

    } 

但是,當我添加Image變量的時候,gson不會創建任何包裝類的實例。

Reedit:剛纔意識到我粘貼了錯誤的http方法。更新的那個,public ArrayList<Card> getCards(MyCardsScreenActivity) {...}其中之一是我打電話來創建包裝類的實例並將它們添加到一個數組列表。

+0

你是什麼意思「這個」Image「變量有目的性,因爲如果我不這樣做,它根本就不工作!」?什麼是你收到的錯誤信息?確切地說, – durron597

+0

。當Image變量未被註釋時,我不工作。但是,現在我的代碼根本不工作,我不知道爲什麼。 反正我沒有收到任何錯誤。當我記錄它時,我可以看到JSON輸出,但是,如果包裝類具有Image變量,我將不會創建任何包裝類的實例。我需要將圖像恢復到系統中。 – qiTsuk

+0

它根本不工作,但它必須做某些事情。 **什麼是錯誤的東西?** – durron597

回答

0

我的包裝類設置錯誤。我不確定如何處理來自服務器的響應,但通過在我的包裝類中進行一些更改,我使它得以運行。

我的包裝類現在看起來像這樣;

import java.io.Serializable; 

    /** 
    * Created by KasperG on 22/04/2015. 
    */ 
    public class Card implements Serializable { 
     private String Email_FK; 
     private String BarcodeNumbers; 
     private String MemberNumber; 
     private String StoreID; 
     private String CardID; 
     private String HasBarcode; 
     private String StoreName; 
     private String CustomCard; 
     private String Image; 


     public Card() { 

     } 

     public Card(String barcodeNumbers, String memberNumber, String storeID, String hasBarcode, String cardID, String storeName, String CustomCard, String Image) { 
      this.StoreID = storeID; 
      if (barcodeNumbers.isEmpty()) { 
       this.BarcodeNumbers = null; 
      } else { 
       this.BarcodeNumbers = barcodeNumbers; 
      } 
      if (memberNumber.isEmpty()) { 
       this.MemberNumber = null; 
      } else { 
       this.MemberNumber = memberNumber; 
      } 
      this.HasBarcode = hasBarcode; 
      this.CardID = cardID; 
      this.StoreName = storeName; 
      this.CustomCard = CustomCard; 
      this.Image = Image; 
     } 

     public String getBarcodeNumbers() { 
      return BarcodeNumbers; 
     } 

     public String getMemberNumber() { 
      return MemberNumber; 
     } 

     public String getHasBarcode() { 
      return HasBarcode; 
     } 

     public String getCardID() { 
      return CardID; 
     } 

     public String getStoreName() { 
      return StoreName; 
     } 

     public int getStoreID() { 
      return Integer.parseInt(StoreID); 
     } 

     public String getCustomStore() { return CustomCard; } 

     public String getImageString() { return Image; } 


     @Override 
     public String toString() { 
      return "MemberNumber: " + MemberNumber + "\n" + 
        "BarcodeNumbers: " + BarcodeNumbers + "\n" + 
        "Store ID: " + StoreID + "\n" + 
        "Has Barcode " + HasBarcode + "\n" + 
        "Card ID: " + CardID + "\n" + 
        "Store Name: " + StoreName + "\n" + 
        "Custom Card? " + CustomCard + "\n" + 
        "Image String: " + Image; 
     } 
    } 

將Image變量的類型改爲String,做成這個;

public ArrayList<Card> getCards(MyCardsScreenActivity activity) { 
     myCards = activity; 

     String email = SaveSharedPreferences.getUserName(activity); 
     ArrayList<Card> cards = new ArrayList<>(); 
     try { 
      String link = "http://address.com/new_get_card_info.php?email=" + email; 
      HttpClient client = new DefaultHttpClient(); 
      HttpGet request = new HttpGet(); 
      request.setURI(new URI(link)); 
      HttpResponse response = client.execute(request); 
      String data = EntityUtils.toString(response.getEntity()); 
      Log.d("Pass3?", data.toString()); 

      Gson gson = new Gson(); 
      Card[] cards1 = gson.fromJson(data.toString(), Card[].class); 
      for(Card card : cards1) { 
       cards.add(card); 
       Log.d("Card toString;\n", card.toString()); 
      } 
     } 
     catch(Exception ex) {} 

     if (!cards.isEmpty()) { 
      myCards.setHasCards(true); 
     } 
     else { 
      myCards.setHasCards(false); 
     } 
     return cards; 
    } 

工作。然後,我只需要處理該字符串;

byte[] bytes = Base64.decode(card.getImageString(), Base64.DEFAULT); 
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

再一次,對於制定不良的問題感到抱歉。我將盡力在未來保持我的問題。

0

爲什麼不用「base64_encoded」版本覆蓋「Image」元素?

即:

while($row = $result->fetch_assoc()) { 
    $row['Image'] = base64_encode($row['Image']); 
    $rows[] = $row; 
} 

我不知道哪裏是$spots陣列是從哪裏來的,所以也許這個解決方案將不會爲你工作,但基本上只是說你從數據庫中取回的每一行,在將其添加到將返回的最終結果數組之前,先更新該行的數組。

+0

對不起,我不知道如何讓映射爲base64類型正確工作,我不熟悉你如何做這個映射(我只用Dozer來做java中的json映射)。你可以使用String類型來解決問題,然後創建一個getter或helper來返回base64類型並在其中進行轉換。我想你必須在base64字符串上進行解碼才能顯示圖像,也許會殺死兩隻鳥。對不起,我無法提供幫助。 –

+0

謝謝你。 PHP文件中的少數幾行實際上就是我所需要的。 – qiTsuk