我正在構建一個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) {...}
其中之一是我打電話來創建包裝類的實例並將它們添加到一個數組列表。
你是什麼意思「這個」Image「變量有目的性,因爲如果我不這樣做,它根本就不工作!」?什麼是你收到的錯誤信息?確切地說, – durron597
。當Image變量未被註釋時,我不工作。但是,現在我的代碼根本不工作,我不知道爲什麼。 反正我沒有收到任何錯誤。當我記錄它時,我可以看到JSON輸出,但是,如果包裝類具有Image變量,我將不會創建任何包裝類的實例。我需要將圖像恢復到系統中。 – qiTsuk
它根本不工作,但它必須做某些事情。 **什麼是錯誤的東西?** – durron597