php - 如何将 BLOB 与 JSON 和 PHP 一起使用?

标签 php android json blob base64

我有一个带有 MySQL 的远程数据库,我将应用程序用户的照片作为 LONGTEXT 类型的数据库行存储在数据库中。

我使用 Base64 将照片转换为字符串。

我使用 JSON 和 PHP 连接到我的远程数据库,因此,我必须使用 Base64,因为据我所知,JSON 和 PHP 需要在参数上发送字符串,使用 Base64 我可以将照片转换为字符串.

它工作正常,但速度很慢。当我加载一张 100 KB 的照片时,它会花费很多时间,但是当我加载一张 5 KB 的照片时,它只需要两三秒。

一位 friend 告诉我使用 BLOB 而不是 Base64,但我如何使用 BLOB 和 JSON 以及与数据库的 PHP 连接?此外,我需要将图像存储在表 USER 的一行中。这是因为用户没有权限将文件上传到远程服务器,但他们可以通过将照片作为字符串上传到 USER 表的一行中来上传照片。

谢谢

编辑:

这是需要等待时间的代码(它在行中等待:while ((line = reader.readLine()) != null) { ,它正在等待 reader.readLine() )

此代码从远程数据库获取一个用户,在我的应用程序上显示该用户需要很长时间

public Friend RetrieveOneUser(String email)
{

    Friend friend=null;

    String result = "";
    //the parameter data to send
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("email",email));

    //http post
    InputStream is=null;
    try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(this.BaseURL + this.GetOneUser_URL);
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
    }catch(Exception e){
            Log.e("log_tag", "Error in http connection "+e.toString());
    }
    //convert response to string
    try{

            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
            }
            is.close();

            result=sb.toString();
    }catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
    }

    //parse json data
    try{
            JSONArray jArray = new JSONArray(result);


            for(int i=0;i<jArray.length();i++)
            {
                    JSONObject json_data = jArray.getJSONObject(i);
                    friend=new Friend(json_data.getString("email"),json_data.getString("password"), json_data.getString("fullName"), json_data.getString("mobilePhone"), json_data.getString("mobileOperatingSystem"),"",json_data.getString("photo"));
            }
    }
    catch(JSONException e){
            Log.e("log_tag", "Error parsing data "+e.toString());
    }

    return friend;
}

最佳答案

将请求分成两部分:

  • 首先下载除图像以外的所有内容的 JSON,然后以 URL 形式返回对图像的引用
  • 第二次将图像下载为二进制 block ,可能是异步的,具体取决于应用

我假设你有类似 http://example.com/userinfo/xxx 的东西作为返回 JSON 的端点?添加一个端点,如 http://example.com/userinfo_image/xxx仅返回图像,然后您可以将其作为二进制 block 返回,而不是在 JSON 中对其进行 Base64 编码。

这意味着您发出两个 HTTP 请求而不是一个,但根据应用程序,您可能能够异步加载图像,如果是这样,从用户的角度来看,您通常会在感知到的应用程序响应时间上获得很大的 yield 。

有关在后台延迟加载图像的信息,请参阅 Android 开发者博客上的帖子以获取示例:

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

如果您不能延迟加载图像,请考虑同时对图像和 JSON 进行并行请求。由于图像的二进制版本占用的网络带宽少得多,而且一旦将数据传输到手机上后的处理也少得多,它看起来应该仍然快得多。

关于php - 如何将 BLOB 与 JSON 和 PHP 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4855447/

相关文章:

android - 使用来自两个数据库表的数据填充 RecyclerView Item

php - 在php中10秒后自动点击提交

php - 在 codeigniter 中为每个用户选择最新记录

android - 如何更新表值

json - 对 Perl 数据结构的每个元素应用不同的函数

javascript - 获取和使用 JSON 对象键名

node.js - 解析附近时,位置 XXX 处 JSON 中意外 token 的错误

javascript - 缩小每个目录的 JS 和 CSS

php - Composer 使用 dockerfile 安装

android - 在整个应用程序中全局广播和接收连接更改的最佳做法是什么?