如何从 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 检索照片?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 5.2 中使用 PHAsset.fetchAssets(withLocalIdentifiers:) 从照片库中检索照片?
如何忽略 Apache HttpComponents HttpClient 5.1 中的 SSL 证书错误