我正在尝试使用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();
}
}
}
只需分配给我们在类变量中声明的位图。
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被全局声明为类变量*
现在此函数将位图转换为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请求
将其上传到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);
}
,我从凌空文档中复制了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端 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”记录,但没有上传图片
那么,我在这里做错了什么?并且有更好的方法来实现我想要做的事情吗?
编辑1:
手动插入了五张图像,该文件夹中应该有一个不存在的Jojo.jpg,但是记录在Mysql中的记录<如图所示
答案 0 :(得分:0)
我解决了这个问题,说实话,这是一个奇特的问题。 Java代码在这里像预期的那样很好,问题是我不知道这种奇怪的php行为,
我给的上传路径是绝对路径,像这样
$upload_path = "android_pool/whatsapp/images/$name.jpg"
但是php由于某些原因将其标记为错误,php希望相对图像目录路径相对于我正在调用的php文件所在的位置。 我知道这是没有道理的,因为绝对路径总是更好,为什么我不知道php为什么不起作用。
所以有效的是
$upload_path = "images/$name.jpg"
只需更改此设置,一切正常。 我通过摆弄和改变事物来解决这个问题,只是为了改变。 因此,我不得不为遇到这个可怜的灵魂而回答这个不直观的问题。