Php Base64对数组中的单行进行编码

Php Base64对数组中的单行进行编码,php,android,base64,gson,Php,Android,Base64,Gson,我正在构建一个Android应用程序,它应该能够拍摄照片,然后将其存储在数据库中。我把那部分记下来了。然而,当我再次尝试将它加载到我的应用程序中时,它就变得棘手了 我将图像作为一个longblob存储在我的数据库中,我可以从logcat中的json读数中看到,longblob是作为字符串返回的。一根很长的绳子,我拿不动。当我尝试添加到gson创建的包装器类时,它只会给我一个空指针 现在,我看到几个地方建议我在php文件中对其进行base64_编码。我已经找到了一种方法来实现这一点,但只是通过在p

我正在构建一个Android应用程序,它应该能够拍摄照片,然后将其存储在数据库中。我把那部分记下来了。然而,当我再次尝试将它加载到我的应用程序中时,它就变得棘手了

我将图像作为一个longblob存储在我的数据库中,我可以从logcat中的json读数中看到,longblob是作为字符串返回的。一根很长的绳子,我拿不动。当我尝试添加到gson创建的包装器类时,它只会给我一个空指针

现在,我看到几个地方建议我在php文件中对其进行base64_编码。我已经找到了一种方法来实现这一点,但只是通过在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();
?>
“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);