Php Base64对数组中的单行进行编码
我正在构建一个Android应用程序,它应该能够拍摄照片,然后将其存储在数据库中。我把那部分记下来了。然而,当我再次尝试将它加载到我的应用程序中时,它就变得棘手了 我将图像作为一个longblob存储在我的数据库中,我可以从logcat中的json读数中看到,longblob是作为字符串返回的。一根很长的绳子,我拿不动。当我尝试添加到gson创建的包装器类时,它只会给我一个空指针 现在,我看到几个地方建议我在php文件中对其进行base64_编码。我已经找到了一种方法来实现这一点,但只是通过在php文件中添加另一个数组,我希望避免在java代码中处理不同的数组 到目前为止,我的php如下所示:Php Base64对数组中的单行进行编码,php,android,base64,gson,Php,Android,Base64,Gson,我正在构建一个Android应用程序,它应该能够拍摄照片,然后将其存储在数据库中。我把那部分记下来了。然而,当我再次尝试将它加载到我的应用程序中时,它就变得棘手了 我将图像作为一个longblob存储在我的数据库中,我可以从logcat中的json读数中看到,longblob是作为字符串返回的。一根很长的绳子,我拿不动。当我尝试添加到gson创建的包装器类时,它只会给我一个空指针 现在,我看到几个地方建议我在php文件中对其进行base64_编码。我已经找到了一种方法来实现这一点,但只是通过在p
<?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();
?>
“Image”变量被故意注释掉了,因为如果我不这样做,它就根本不起作用
在这里,我使用gson从包装器创建类
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;
}
然而,这在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方法。更新的一个是
公共ArrayList getCards(MyCardsScreenActivity){…}
一个,我正在调用它来创建包装类的实例并将它们添加到ArrayList中。为什么不用base64_编码的版本覆盖“Image”元素呢
即:
我不确定
$spots
数组是从哪里来的,所以这个解决方案可能对您不起作用,但基本上只是说,对于从数据库返回的每一行,在将其添加到最终返回的结果数组之前,更新该行的数组。我的包装器类设置错误。我不确定如何处理来自服务器的响应,但通过在包装器类中做一些更改,我使它开始工作
我的包装器类现在看起来像这样
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;
}
再一次为这个措词不当的问题感到抱歉。我以后会尽量把我的问题更切题。对不起,我不知道如何让映射正确地用于base64类型,我不熟悉您是如何进行映射的(我只使用Dozer在java中进行json映射)。您可以只使用字符串类型,然后创建一个getter或helper来返回base64类型并在其中进行转换。我想你无论如何都得解码base64字符串才能显示图像,也许会杀死两只鸟。。对不起,我帮不上忙了,谢谢你。php文件中的几行实际上就是我所需要的。你说“Image”变量被故意注释掉是什么意思,因为如果我不这样做,它就根本不工作了!”?您收到的错误消息是什么?没错。当Image变量没有被注释掉时,我不工作。然而,现在我的代码根本不起作用,我不知道为什么。无论如何,我没有得到任何错误。我可以在记录JSON输出时看到它,但是,如果包装器类有Image变量,我将不会创建包装器类的任何实例。我需要把图像恢复到系统中。它根本不工作,但它一定在做些什么。有什么不对吗?寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为,以及在问题本身中复制它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。看:所以,我成功了!我基本上只是将Base64图像更改为字符串图像,然后在代码的另一个位置执行Base64解码。我为这个措词不当的问题道歉。
while($row = $result->fetch_assoc()) {
$row['Image'] = base64_encode($row['Image']);
$rows[] = $row;
}
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;
}
}
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);