Android 图片上传到 php 服务器 base64 不工作

Android Image Upload to php server base64 not working

我正在尝试使用 Base64 方法将图片从图库上传到我的本地 php 服务器。代码没有错误,一切似乎都很好,记录的 mysql 条目正在处理,但图像没有保存。

通过按下这个按钮,我可以按意图获取图像 android代码

public void uploadImageButtonFunction(View view){

    Intent intent = new Intent();
    // Show only images, no videos or anything else
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    // Always show the chooser (if there are multiple options available)
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}

这只是通过按一个按钮打开图片库 按下该按钮并在我们接收图像的地方选择图像后

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {

            filepathUri = data.getData();

            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filepathUri);
                // Log.d(TAG, String.valueOf(bitmap));
                String s = getRealPathFromURI(filepathUri);
                Log.i("imagepath", s);
                textView.setText(s.split("/")[s.split("/").length - 1]);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

只是分配给我们在class变量中声明的位图

public String getRealPathFromURI(Uri uri) {
    String[] projection = {MediaStore.MediaColumns.DATA};
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
    cursor.moveToFirst();
    String imagePath = cursor.getString(column_index);

    return imagePath;
}

*该方法从uri获取图片的PATH,uri全局声明为class变量*

现在这个函数将位图转换为Base64字符串

 private String imageToString(Bitmap bitmap){

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
        byte[] imBytes = byteArrayOutputStream.toByteArray();
        return Base64.encodeToString(imBytes, Base64.DEFAULT);
    }

这是通过 POST 请求与 volley 库 [=21 将其上传到 php 服务器=]

private void uploadImageBase64(){

StringRequest stringRequest = new StringRequest(Request.Method.POST, signUpUrl,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {


                try {

                    name.setText("");
                    number.setText("");
                    textView.setText("");

                    Log.i("resp", response);
                    Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show();

                }catch (Exception e){
                    Toast.makeText(Insert.this, e.getMessage(), Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {

        Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();

    }
})


{


    @Override
    protected Map<String, String> getParams() throws AuthFailureError {

        Map<String, String> params = new HashMap<String, String>();
        params.put("name", name.getText().toString().trim());
        params.put("number", number.getText().toString().trim());
        params.put("image", imageToString(bitmap));

        return params;
    }
};

MySingleton.getInstance(Insert.this).addToRequestQueue(stringRequest);


}

我从 volley 文档

复制了 MySingleton class

如果你需要的话就在这里

package com.example.slimshady.whatsappclone;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

public class MySingleton {
    private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;

    MySingleton(){}

    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });
    }

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}

现在 php 一方 sim 足够的代码,我正在使用 wamp server

PHP 代码

<?php

$conn=mysqli_connect("localhost","root","", "shady") or die("Unable to connect");

$name = $_POST["name"];
$number = $_POST["number"];
$image = $_POST["image"];

$upload_path = "android_pool/whatsapp/images/$name.jpg"; // String concatination happening here between the $name variable and the .jpg string
$imagelink = "http://1.0.0.2/android_pool/whatsapp/images/$name.jpg";

if(mysqli_connect_error($conn)) {
    echo "Failed To Connect";
}

$qry = "INSERT INTO contacts (`name`, `number`, `imagelink`) VALUES('$name', '$number', '$imagelink')";

$res = mysqli_query($conn, $qry);

if ($res) {


    file_put_contents($upload_path, base64_decode($image));

    echo $image;

    echo json_encode(array('response'=>'image Uploaded'));


}else{
    echo json_encode(array('response'=>'image not uploaded'));
}


mysqli_close($conn);        


?>

正在插入记录,但文件夹中没有图像 查看已插入的 "jojo" 记录,但没有为其上传图片

图像文件夹不包含 jojo.jpg

那么我做错了什么?有没有更好的方法来实现我想要做的事情?

编辑 1:

五张图片是手动插入的,本文件夹应该有一个Jojo.jpg不存在,但在Mysql<如图图片中

我解决了这个问题,老实说这是一个奇怪的问题。 java 代码在这里没有问题,问题是我不知道这种奇怪的 php 行为,

我给的上传路径是绝对路径,像这样

$upload_path = "android_pool/whatsapp/images/$name.jpg"

但 php 出于某种原因将此标记为错误,php 想要相对图像目录路径与我正在调用的 php 文件所在的位置相关。 我知道没有意义,因为绝对路径总是更好,为什么 php 不能用我不知道。

所以有效的是

$upload_path = "images/$name.jpg"

只需更改此设置即可。 我只是为了改变而摆弄和改变事物来解决这个问题。 所以我觉得有义务为遇到它的一些可怜的灵魂回答这个不直观的问题。