如何从 HttpClient 检索照片?

Posted

技术标签:

【中文标题】如何从 HttpClient 检索照片?【英文标题】:How to retrieve a photo from 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 【参考方案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);

【讨论】:

以上是关于如何从 HttpClient 检索照片?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Facebook 检索照片

如何在 Swift 5.2 中使用 PHAsset.fetchAssets(withLocalIdentifiers:) 从照片库中检索照片?

如何从 Instagram 上的多张照片中检索所有图像

如何忽略 Apache HttpComponents HttpClient 5.1 中的 SSL 证书错误

当照片选择器返回差异文件名时如何从 MediaLibrary 检索照片文件

如何以编程方式从照片应用程序中检索所有照片/视频并将其复制到我的应用程序?