如何使用POST方法

时间:2016-07-17 21:16:06

标签: android

我要求必须使用POST方法从数据库将用户图像下载到应用程序。在这里,我需要通过POST方法将userId传递给PHP并获取图像作为响应。我会将此图像存储并显示在ImageView中。我已经在iOS上完成了这项工作并且在那里工作得很好,但对于Android我需要帮助。

我已经做了很多谷歌搜索,但只找到了使用GET方法或直接URL方法下载图像但没有POST方法的教程。请使用POST方法帮助我使用任何示例代码。 我已经在ios上使用的PHP文件如下所示。

<?php

require("userdao.php");
...
$userId = htmlentities($_POST["userId"]);

$returnValue = array();
$dao = new userdao($dbhost, $dbuser, $dbpass, $dbname);
$dao->openConnection();
$userPhoto = $dao->getUserPhoto($userId);
$returnValue = $userPhoto["user_photo"];
$dao->closeConnection();

echo ($returnValue);
return;
?>

编辑:这是一些额外的信息, 使用blob将图像存储在数据库中。以上php需要userid输入&amp;从表中获取相应的图像,然后回读它。这里没有json_encode。我有这个应用程序的其他php正在执行字符串请求&amp;使用凌空和放大器获得回复多数民众赞成。但对于这个特殊的我需要图像作为响应,我无法找到可以使用POST方法发送一个参数的图像请求或位图请求的代码。获得图像响应。 这个php常用于ios&amp;机器人。我需要android的代码来使这项工作。 还有一件事,经过大量的搜索,我发布了这个问题。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我已经完成了它,虽然不是直接但是有解决方法。我在php中将图像转换为base64字符串。在android中我使用StringRequest来POST用户ID和接收编码的字符串,然后解码字符串&amp;将它转换回图像。

PHP代码: userPhoto.php

<?php

...
$userId = htmlentities($_POST["userId"]);
...
$userImage= $userPhoto["user_photo"];
$returnValue["userIdEncoded"] = base64_encode($userImage);
...

echo json_encode($returnValue);
return;
?>

Android代码: 创建新的java文件以从数据库中获取数据:

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;

import java.util.HashMap;
import java.util.Map;

public class PhotoRequest extends StringRequest {

    private static final String photoRequestUrl = "http://.../php/userPhoto.php";
    private Map<String, String> params;

    public PhotoRequest (String userId, Response.Listener<String> listener, Response.ErrorListener errorListener){
        super(Request.Method.POST, photoRequestUrl, listener, errorListener);
        params = new HashMap<>();
        params.put("userId", userId);
    }

    @Override
    public Map<String, String> getParams() {
        return params;
    }
}

将以下代码添加到MainActivity以保存图像:

Response.Listener<String> photoResponseListener = new Response.Listener<String>() {

    @Override
    public void onResponse(String imageResponse) {
        try {
            JSONObject jsonResponse = new JSONObject(imageResponse);

            final String userPhotoEncodedString = jsonResponse.getString("userIdEncoded");
            final byte[] decodedString = Base64.decode(userPhotoEncodedString, Base64.DEFAULT);
            Bitmap decodedImage = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

            ContextWrapper cw = new ContextWrapper(getApplicationContext());
            File imageDirectory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            boolean isDirectoryExists = imageDirectory.exists();
            if (!isDirectoryExists) {
                isDirectoryExists = imageDirectory.mkdir();
                }
            System.out.println("isDirectoryExists:" + isDirectoryExists);

            File imagePath = new File(imageDirectory, "userPhoto.png");
            boolean isFileExists = imagePath.exists();
            if(isFileExists){
                isFileExists = imagePath.delete();
            }
            System.out.println(isFileExists);

            FileOutputStream fos;
            try {
                fos = new FileOutputStream(imagePath);
                decodedImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        }
    };

    PhotoRequest photoRequest = new PhotoRequest(userId, photoResponseListener, null);
    RequestQueue queue = Volley.newRequestQueue(LoginPage.this);
    queue.add(photoRequest);

以下代码显示已保存文件中的图像:

final ImageView ivUserPhoto = (ImageView) findViewById(R.id.ivUserPhoto);

try {
    ContextWrapper cw = new ContextWrapper(getApplicationContext());
    File imageDirectory = cw.getDir("imageDir", Context.MODE_PRIVATE);
    File imagePath = new File(imageDirectory, "userPhoto.png");
    Bitmap userImage = BitmapFactory.decodeStream(new FileInputStream(imagePath));
    ivUserPhoto.setImageBitmap(userImage);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}