PHP如何响应移动端(android or ios)的post请求(使用file_get_contents)
file_get_contents这个函数是PHP在处理http请求时接受移动端数据的非常重要的一个方法
他的作用是把整个文件读入一个字符串中。
file_get_contents(path,include_path,context,start,max_length)
参数 | 描述 |
---|---|
path | 必需。规定要读取的文件。 |
include_path | 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。 |
context |
可选。规定文件句柄的环境。 context 是一套可以修改流的行为的选项。若使用 null,则忽略。 |
start | 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。 |
max_length | 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。 |
所以对于一个移动端上传一个文件的请求,以android为例子:
private static final int BUFFER = 2048; private void testPost() { String url = "http://2.novelread.sinaapp.com/framework-sae/index.php?c=main&a=getPostBodyAndContent"; DefaultHttpClient client = null; HttpRequestBase http = null; HttpResponse response = null; ByteArrayOutputStream outStream = null; byte data[] = new byte[BUFFER]; try { http = new HttpPost(url); //在手机SD上有一张11.jpg的图片 File f = new File(Environment.getExternalStorageDirectory(), "11.jpg"); long length = f.length(); //发给服务端的数据使用byte的格式 outStream = new ByteArrayOutputStream(); BufferedInputStream in_buf_stream = null; //先写入文件(11.jpg)的大小 String s = String.valueOf(length); s = String.format("%08d", length); outStream.write(s.getBytes()); //再写入11.jpg in_buf_stream = new BufferedInputStream(new FileInputStream(f), BUFFER); int count; while ((count = in_buf_stream.read(data, 0, BUFFER)) != -1) { outStream.write(data, 0, count); } ByteArrayEntity att_byte = null; if (outStream != null) { att_byte = new ByteArrayEntity(outStream.toByteArray()); try { if (outStream != null) { outStream.close(); outStream = null; } } catch (Throwable th) { } //用setEntity的方式写到http请求中 ((HttpEntityEnclosingRequestBase) http).setEntity(att_byte); } DefaultHttpClient httpClient = RestHttpClient.getClient().getHttpClient(); response = httpClient.execute(http); int code = response.getStatusLine().getStatusCode(); if (code == HttpStatus.SC_OK) { HttpEntity respEntity = response.getEntity(); InputStream inputStream = respEntity.getContent(); StringBuilder builder = new StringBuilder(); InputStreamReader Inreader = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(Inreader); String line; try { while ((line = reader.readLine()) != null) { builder.append(line).append(" "); } } finally { try { reader.close(); } catch (IOException e) { } } } try { if (att_byte != null) { att_byte.consumeContent(); att_byte = null; } } catch (Throwable th) { } } catch (ClientProtocolException e) { } catch (Exception e) { } }
这个post请求是先写入文件大小,然后才是文件的内容,这个时候PHP这边
$raw .= file_get_contents("php://input");
这里$raw就存储了客户端传来的entity里的以byte方式存储的数据
然后我们需要分割这些数据:
$length = substr($raw,0,8);
$content = substr($raw,8,$length);
这样我们就得到文件的内容$content,我们可以把这个内容保存成一个文件,这里是保存在sae的domain上面,"file"是我的domain名称,我在"file"上创建了一个文件夹test
<span style="white-space:pre"> </span> $storage = new SaeStorage(); $domain = "file"; $destFileName = "/test/".$img_name; $result = $storage->write($domain,$destFileName, $content, -1,$attr,false); echo $result;
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。