【问题标题】:How to retrieve a photo from HttpClient?如何从 HttpClient 检索照片?
【发布时间】:2014-02-08 03:34:41
【问题描述】:

我正在使用 HttpClient 从我的 Android 设备向一个简单的 HTTP 服务器发出请求,该服务器包含一个用于检索图片的 PHP 脚本。图片在 blob 数据中可用。这意味着如果我在服务器端执行这个小 PHP 代码:

 file_put_contents("myPicture.png", $blob_data);

我使用名为 myPicture.png 的文件将图片保存在服务器中。现在我想获取这个 $blob_data(我的图片)以将其保存在我的 Android 设备中,而不是 HTTP 服务器中。有人可以给我一个提示,让我从 PHP 脚本中返回 blob 数据并获取 Android 设备内的图片以将其存储在本地?

这是我的 HTTPClient:

@Click(R.id.btn_login)
@Background
public void LoginTrigger(){

    String nUsername = username.getText().toString().trim();
    String nPassword = password.getText().toString().trim();

    if (nUsername.matches("") || nPassword.matches("")){

        displayToast("Please insert your login!");
    }
    else{
        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        urlParameters.add(new BasicNameValuePair("username", nUsername));
        urlParameters.add(new BasicNameValuePair("password", nPassword));

        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(SERVER_PROXY);
        post.setHeader("User-Agent", SERVER_USER_AGENT);
        try{
            post.setEntity(new UrlEncodedFormEntity(urlParameters, "utf-8"));
        }
        catch(Exception e){
            Log.getStackTraceString(e);
        }

        HttpResponse response = null;
        try{
            response = client.execute(post);
            Log.e("Response Code : ", " = " + response.getStatusLine().getReasonPhrase());

            InputStream inputStream = response.getEntity().getContent();

            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            inputStream.close();
            String responseMessage = sb.toString();
            checkLogin(responseMessage);
        }
        catch(Exception e){
            Log.e("HTTP-ERROR", " = " + Log.getStackTraceString(e));
            displayToast("Check your Internet connection!");
        }
    }
}

当我在 PHP 脚本中回显它时,字符串 responseMessage 包含我的 blob 数据。我只需要将这个流放在位图或其他东西中,但我不知道如何完成它。

如果你知道的话,谢谢!

【问题讨论】:

  • 你能分享你从服务器下载数据的 HttpClient 代码吗?我不确定你卡在哪里了。
  • 嗨,布兰登,感谢您的关注,我刚刚将我的 HTTPClient 添加到帖子中。 HTTPClient 不下载任何东西,它只是要求我的 PHP 脚本检索我的图片。现在我想将我的 PHP 变量“$blob_data”中的这张图片返回到我的 Android 设备,感谢 HTTPClient 并在本地下载图片,以将其存储在我的 Android 设备中。我希望我更清楚。
  • 我想你想添加一个PHP标签来获得一些帮助,将图像添加到HTTP响应中。
  • 谢谢,你是对的,我已经做到了;D

标签: php android httpclient


【解决方案1】:

php 代码(服务器)

<?php
header('Content-Type: image/png');
echo($blob_data);
?>

java 代码(设备)

URL url = new URL ("http://myserver.com/myPicture.png");
InputStream input = url.openStream();
try {
    //The sdcard directory e.g. '/sdcard' can be used directly, or 
    //more safely abstracted with getExternalStorageDirectory()
    File storagePath = Environment.getExternalStorageDirectory();
    OutputStream output = new FileOutputStream (new File(storagePath,"myPicture.png"));
    try {
        byte[] buffer = new byte[aReasonableSize];
        int bytesRead = 0;
        while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
            output.write(buffer, 0, bytesRead);
        }
    } finally {
        output.close();
    }
} finally {
    input.close();
}

清单

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

【讨论】:

    【解决方案2】:

    您需要同时更改客户端和服务器代码。

    服务器代码

    在你的 PHP 脚本末尾添加这个

    header("Content-Type: image/png");
    header("Content-Length: " . mb_strlen($blob_data, '8bit'));
    echo $blob_data;
    exit;
    

    客户端代码

    您的代码尚未准备好读取二进制数据,请查看其他问题以了解如何执行此操作:how to download image from any web page in java

    【讨论】:

    • 谢谢adosaiguas,我要试试这个解决方案。
    【解决方案3】:

    不建议将实际文件发送到您的 android 应用程序,最好的方法是发送 base 64 编码 a link 图像字符串,它将包含所有元数据图片的数据,然后从base46编码的字符串中加载图片

     $image = base64_decode($file_path);
     return response::json(array('image'=>$image);
    

    像对象一样接收它,然后像这样使用 base64code 图像渲染您的图像
    我是这样用js做的

    var reader = new FileReader();
    reader.onload = function(e) {
                image_base64 = e.target.result;
                preview.html("<img src='" + image_base64 + "'/>");
    
            };
            reader.readAsDataURL(file);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2021-07-04
      相关资源
      最近更新 更多