【问题标题】:Get BLOB image from mysql database via JSON通过 JSON 从 mysql 数据库中获取 BLOB 图像
【发布时间】:2015-07-28 10:40:15
【问题描述】:

我的 MySQL 数据库中有一个图像存储为 BLOB。我通过 PHP JSON 数组将图像返回到 android 应用程序,如下所示:$row_array['image'] = base64_encode($row['image']); 现在我在 android 中得到这样的值 String image = c.getString(TAG_IMAGE); 其中 c 是一个 JSON 对象。然后我尝试解码它

byte[] b = Base64.decode(image, 0);

Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);

但这只会给我一个空指针异常并崩溃。我在这里做错了什么?

Logcat:

05-16 15:40:47.469: E/AndroidRuntime(30925): FATAL EXCEPTION: main
05-16 15:40:47.469: E/AndroidRuntime(30925): java.lang.NullPointerException
05-16 15:40:47.469: E/AndroidRuntime(30925):    at com.example.shareity.ListNew$JSONParse.onPostExecute(ListNew.java:254)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at com.example.shareity.ListNew$JSONParse.onPostExecute(ListNew.java:1)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at android.os.AsyncTask.finish(AsyncTask.java:631)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at android.os.Looper.loop(Looper.java:137)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at android.app.ActivityThread.main(ActivityThread.java:4745)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at java.lang.reflect.Method.invokeNative(Native Method)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at java.lang.reflect.Method.invoke(Method.java:511)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-16 15:40:47.469: E/AndroidRuntime(30925):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 发布异常。是在 Base64.decode(图像中没有数据)还是在 BitmapFactory.decodeByteArray(数据无法正确 base64 解码)?
  • 它只是将 NullPointerException 说成 blah blah @JPMoresmau
  • @YohanBlake 对您来说,它可能看起来不过是“等等等等”,但您的答案可能就在“等等等等”之内。如果您发布异常输出,有人可能会帮助您从中找到答案。
  • 你试过我的答案了吗?
  • @DanGetz 我已经添加了 logcat

标签: php android mysql json blob


【解决方案1】:
<?php 
$db = mysql_connect("localhost","user","password") or die(mysql_error()); 
mysql_select_db("shareity",$db) or die(mysql_error()); 
$userId = $_GET['eid']; 
$query = "SELECT image FROM event WHERE eid='$userId'"; 
$result = mysql_query($query) or die(mysql_error()); 
$photo = mysql_fetch_array($result); 
header('Content-Type:image/jpeg'); 
echo $photo['image']; 
?>

【讨论】:

    【解决方案2】:

    假设event 是表名,image 是保存BLOB 图像的列名,user_id 是用户/行的 id。要从 BLOB 中提取图像,您应该创建一个 EXTRA PHP 文件。想要这样的东西。

    get_image.php

    <?php 
    $db = mysql_connect("localhost","user","password") or die(mysql_error()); 
    mysql_select_db("shareity",$db) or die(mysql_error()); 
    $userId = $_GET['eid']; 
    $query = "SELECT image FROM event WHERE eid='$userId'"; 
    $result = mysql_query($query) or die(mysql_error()); 
    $photo = mysql_fetch_array($result); 
    header('Content-Type:image/jpeg'); 
    echo $photo['image']; 
    ?>
    

    现在,get_image.php 就像一个图像。如果您通过 GET 将user_id 传递给get_image.php,则会抛出user_image

    因此,当您从服务器端对 json 进行编码时,请添加一个字段,该字段将用户 ID 附加到 get_image.php 像这样

    {
     'ID':1,
     'userName':'John',
     'image_url':'http://your-host-name/get_image.php?ID=1'
    }
    

    所以在Android上,你可以像这样解码图像

    try {
        URL url = new URL("http://your-host-name/get_image.php?ID=1");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
    } catch (IOException e) {
        // Log exception
        return null;
    }
    

    更多说明可以fndhere

    【讨论】:

    • 你能告诉我在我的原始 php 文件中包含什么以获得 JSON 结果{ "image_url":"http://example.com/myImageDecoder.php?id=1" }吗?
    • 它必须是$row_array['image'] = something ; 你能告诉我要在那里添加什么吗?
    • 是的,$con 持有数据库连接。让我问你一些问题。将图像保存为 BLOB 数据类型的 table name and column name 是什么?
    • 表名是事件。列名是图像
    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2015-01-23
    • 2016-01-01
    • 2014-02-19
    • 2017-01-06
    • 2018-11-01
    相关资源
    最近更新 更多