我想通过Android应用程序将图像上传到我的服务器但是我还希望将其他数据与图像一起传递(身份验证,意图等)。
我一直在提出这样的请求:
http://server/script.php?t=authtoken&j_id=12&... etc
但是,我假设我不能简单地使用另一个包含图像字节数组的查询参数,因为这会导致大小为数百万字符的URL。
&image=001101010010110111010001010101010110100101000101010100010... etc
我对如何处理这个问题感到茫然,并希望得到任何建议。如果我无法通过http请求发送数据,我将如何处理传入数据服务器端?
感谢。
答案 0 :(得分:0)
以下是我如何让那些可能在将来找到它的人工作。
对于此示例,假设我们要使用参数upload.php
和www.server.com
查询t=ABC123
根目录上的PHP脚本id=12
。除此请求外,我们还希望上传存储在java.io.File
对象img
中的图像。我们也期待服务器的响应,让我们知道上传是否成功。
ANDROID SIDE
在android方面,你需要以下JAR:
apache-mime4j-core-0.7.2.jar
可用here和:
httpclient-4.3.1.jar
httpcore-4.3.jar
httpmime-4.3.1.jar
可用here。
以下是有关如何发出多部分请求并获得回复的摘录:
public String uploadRequest(String address, File img)
{
HttpParams p = new BasicHttpParams();
p.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
DefaultHttpClient client = new DefaultHttpClient(p);
HttpPost post = new HttpPost(address);
// No need to add regular params as parts. You can if you want or
// you can just tack them onto the URL as usual.
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("image", new FileBody(img));
post.setEntity(builder.build());
return client.execute(post, new ImageUploadResponseHandler()).toString();
}
private class ImageUploadResponseHandler implements ResponseHandler<Object>
{
@Override
public Object handleResponse(HttpResponse response) throws ClientProtocolException, IOException
{
HttpEntity responseEntity = response.getEntity();
return EntityUtils.toString(responseEntity);
}
}
在代码中使用此方法的示例(假设变量img
已经声明包含您要上传的图像的File
对象:
// Notice regular params can be included in the address
String address = "http://www.server.com/upload.php?t=ABC123&id=12";
String resp = uploadRequest(address, img);
// Handle response
PHP SIDE
对于服务器端脚本,可以通过PHP的$_REQUEST
对象正常访问文本参数:
$token = $_REQUEST['token'];
$id = $_REQUEST['id'];
上传的图像可以使用存储在PHP $_FILES
对象中的信息进行访问(有关详细信息,请参阅PHP文档):
$img = $_FILES['img'];