Я пытаюсь загрузить изображение из галереи на свой локальный 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;
}
* Этот метод получает ДОРОЖКА изображения из 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-запрос с библиотекой volley
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
<?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 <как показано на изображении
эти 5 изображений вводятся вручную
Я только что упомянул в редакции.






Я решил проблему, если честно, она была своеобразной. Код java здесь в порядке, как и ожидалось, проблема заключалась в том, что я не знал этого странного поведения php,
я давал путь загрузки с абсолютным путем, например
$upload_path = "android_pool/whatsapp/images/$name.jpg"
но php по какой-то причине помечает это как неправильное, php хочет, чтобы относительный путь к каталогу изображений соответствовал тому, где находится файл php, который я вызываю. Я знаю, что это бессмысленно, потому что абсолютный путь всегда лучше, и почему php не работает с этим, я понятия не имею.
так что работает
$upload_path = "images/$name.jpg"
просто изменив это, все работает. Я решил это, возясь и меняя вещи просто ради изменения. Поэтому я чувствовал себя обязанным ответить на эту нелепую проблему для какой-то бедняги, которая с ней сталкивается.
эти 5 изображений были вставлены таким же образом?