我通过将图像转换为字节数组,将图像从Android上传到PHP。之后,我只需使用POST方法提交它。
在服务器端,我会在客户端(Android应用程序)端执行相反操作。
我想知道是否有其他好的/有效的/聪明的方法来做到这一点。
注意:我只需要在客户端使用PHP / JS / HTML和Java。
答案 0 :(得分:0)
最有效的方法之一就是使用Volley,所以一定要把它包含在你的gradle中:
compile 'com.android.volley:volley:1.0.0'
我个人使用Universal Image Loader,当你加入Volley时会自动包含它。由于您没有放置您尝试过的任何代码,我将举例说明。在您尝试上传图片的活动中,创建一个按钮。单击该按钮时添加此代码:
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
i.setType("image/*");
startActivityForResult(i, Constants.VALUE_BROWSE_IMAGE_REQUEST);
这将打开手机中的图库以浏览图像。在活动顶部声明一个变量:
private Bitmap mBitmap;
选择要从图库上传的图片后,请输入以下代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.VALUE_BROWSE_IMAGE_REQUEST &&
resultCode == RESULT_OK &&
data != null) {
try {
// Get the photo URI data
Uri filePath = data.getData();
// Get the Bitmap from Gallery
mBitmap = decodeBitmap(filePath, this);
} catch (IOException e) {
Toast.makeText(this, "Could not open picture.", Toast.LENGTH_SHORT).show();
}
}
}
现在你已经拥有所选图像的位图,你需要将该位图转换为base64字符串,以便Volley能够上传它:
// Before uploading the selected image to the server, we need to convert the Bitmap to String.
// This method will convert Bitmap to base64 String.
private String getStringImage(Bitmap bmp) {
ByteArrayOutputStream b = new ByteArrayOutputStream();
// This part handles the image compression. Keep the image quality
// at 70-90 so you don't cause lag when loading it on android
// (0-low quality but fast load, 100-best (original) quality but slow load)
bmp.compress(Bitmap.CompressFormat.JPEG, 80, b);
byte[] imageBytes = b.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
return encodedImage;
}
最后,您可以开始上传图片:
private void uploadImage() {
StringRequest stringRequest = new StringRequest(
Request.Method.POST,
"URL_TO_YOUR_WEB_API",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), "Failed to upload image.", Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
// Converting Bitmap to String
String image = getStringImage(mBitmap);
// Create parameters
Map<String, String> params = new Hashtable<>();
// Add parameters
params.put("action", "YOUR_BACKEND_KEY1");
params.put("...", image);
// Returning parameters
return params;
}
};
// Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
// Adding request to the queue
requestQueue.add(stringRequest);
}
确保用你在php中创建后端来替换参数字符串。
示例网址:
http://yoursite.com/api.php?action=uploadimage&imagebase=adwtgiuewohnjsoiu&caption=somecaptiontext
然后android中的参数是:
params.put("action", "uploadimage");
params.put("imagebase", image);
params.put("caption", "somecaptiontext");