我知道这个问题已被多次询问,但我确实在理解正在发生的事情时遇到了问题
我有一个项目来创建一个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
如果您对此有任何了解,请提供帮助
抱歉这个漫长的问题......
感谢您的时间
答案 0 :(得分:0)
我认为如果您在Base64字符串之前添加"data:image/png;base64,"
,您的问题可能会得到解决。所以试试这个:
params.put("image", "data:image/png;base64," + Base64.encodeToString(nImage,Base64.DEFAULT));