Я пытаюсь загрузить изображение из галереи на мой локальный php-сервер методом Base64.Код не выдает ошибки, и все выглядит нормально, запись 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();
}
}
}
Просто присвоить растровое изображение , которое мы объявили в переменной класса.
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;
}
* Этот метод получает PATH изображения из uri, uri объявлен глобально как переменная класса *
теперь эта функция преобразует растровое изображение в строку 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);
}
это то, что загружает его на php-сервер с POST-запросом с библиотекой залпа
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);
}
и я скопировал класс MySingleton из документации залпа
вот оно, если вам нужно
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 достаточно кода, я использую сервер wamp
PHP CODE
<?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 "запись вставлена, но изображение для нее не загружено
папка images не содержит jojo.jpg
Так что же я здесь не так делаю?и есть ли лучший способ добиться того, что я пытаюсь сделать?
Редактировать 1:
Пять изображений вставляются вручную, должен быть Jojo.jpgВ этой папке, которой нет, но запись о ней присутствует в Mysql <Как показано на изображении </strong>