将图像存储在数据库中并检索它以作为json回显

时间:2016-09-20 17:08:26

标签: php android mysql json image

我知道这个问题已被多次询问,但我确实在理解正在发生的事情时遇到了问题

我有一个项目来创建一个Android应用程序,它使用与我的合作伙伴正在处理的网站相同的数据库

我的问题是处理图片

我知道我们不应该将图像存储在数据库中....但我们也在这里

图像作为blob存储在数据库中 它在网站上运行良好 但不是我的应用

我将从网站上传到数据库的一些图片加载到应用程序中 以及我使用sql wamp服务器接口上传的一些

他们工作正常

但是当我将应用程序中的图像上传到数据库时 当我取回它时,它根本不显示

这就是我正在做的事情

我开始尝试使用此代码选择图像

Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,"Select Picture"), 1);

和ononActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == 1) {
            Uri selectedImageUri = data.getData();
            try {
                PickedImage= MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri);

                nPostImage.setImageBitmap(PickedImage);

                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                PickedImage.compress(Bitmap.CompressFormat.PNG, 100, baos);
                nPostImageBytes = baos.toByteArray();

            } catch (IOException e) {
                Toast.makeText(this,"Error Selecting Picture",Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }// if picking a picture
    }//if ok
}//On activity get result

然后我调用此方法将数据上传到数据库 使用齐射

private void AddPost(final String UserID, final String UserType, final String nText, final byte[] nImage)
{
    final ProgressDialog loading=ProgressDialog.show(this,"please wait...","adding",false,false);

    String url="http://192.168.43.178/studentpool/add_post.php";

    StringRequest stringRequest=new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            loading.dismiss();
            try {
                JSONObject jsonObject=new JSONObject(response);
                if(jsonObject.getInt(LoginActivity.TAG_SUCCESS)==1)
                {
                    loading.dismiss();
                    Toast.makeText(AddPostActivity.this,"Added Successfully",Toast.LENGTH_SHORT).show();

                    Intent intent=new Intent(AddPostActivity.this,MainActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
                else
                {
                    loading.dismiss();
                    Toast.makeText(AddPostActivity.this,jsonObject.getString("message"),Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(AddPostActivity.this,"Error adding",Toast.LENGTH_SHORT).show();
            }
        }
    }, new Response.ErrorListener(){
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("id",UserID);
            params.put("type",UserType);
            params.put("text",nText);
            params.put("image",Base64.encodeToString(nImage,Base64.DEFAULT));

            return params;
        }
    };

    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}//AddPost}

这是我的PHP代码

<?php if($_SERVER['REQUEST_METHOD']=='POST'){
$id  = $_POST['id'];
$text= $_POST['text'];
$image=$_POST['image'];
$type=$_POST['type'];

require_once __DIR__ . '/db_config.php';

$con = mysqli_connect(DB_SERVER,DB_USER,DB_PASSWORD,DB_DATABASE);

$dt = new DateTime();
$dt->add(new DateInterval('PT3H'));

$result=mysqli_query($con,"INSERT INTO posts(user_id,text,post_image,date,type) VALUES ('$id','$text','$image','".$dt->format('Y-m-d h:i:s')."','$type')");

if ($result)
{

//success
$response["success"] = 1;

echo json_encode($response);

}
else
{
    $response["success"] = 0;
    $response["message"] = "Error adding the post";

    echo json_encode($response);
}}else{
$response["success"] = 0;
$response["message"] = "Missing required data";

// echo no users JSON
echo json_encode($response); }//no data ?>

我尝试将post_image类型更改为mediumtext以查看存储在数据库中的内容

并且工作正常的图像(从界面上传的图像)具有这种格式

...ÿØÿàJFIFÿÛC

从应用上传的内容具有此格式

/ 9J / 4AAQSkZJRgABAQAAAQABAAD / 2wBD ..

我尝试在将图像存储到数据库之前对其进行编码 但我得到了一个JSONexception

如果您对此有任何了解,请提供帮助

抱歉这个漫长的问题......

感谢您的时间

1 个答案:

答案 0 :(得分:0)

我认为如果您在Base64字符串之前添加"data:image/png;base64,",您的问题可能会得到解决。所以试试这个:

params.put("image", "data:image/png;base64," + Base64.encodeToString(nImage,Base64.DEFAULT));