首先,
multipartContent-Type 的第一个规则是 定义一个边界 , 该边界
将用作每个部分之间的定界符(因为顾名思义,它可以包含多个部分)。边界可以是 内容正文中不包含的任何字符串 。我通常会使用时间戳记:
define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));定义边界后,必须将其与
Content-Type标头一起发送,以告知Web服务器期望使用什么定界符:
$header = 'Content-Type: multipart/form-data; boundary='.MULTIPART_BOUNDARY;
完成后,您必须构建与HTTP规范和您发送的标头匹配的适当的内容主体。如您所知,从表单发布文件时,通常将具有一个表单字段名称。我们将定义它:
// equivalent to <input type="file" name="uploaded_file"/>define('FORM_FIELD', 'uploaded_file');然后,我们构建内容主体:
$filename = "/path/to/uploaded/file.zip";$file_contents = file_get_contents($filename);$content = "--".MULTIPART_BOUNDARY."rn". "Content-Disposition: form-data; name="".FORM_FIELD.""; filename="".basename($filename).""rn". "Content-Type: application/ziprnrn". $file_contents."rn";// add some POST fields to the request too: $_POST['foo'] = 'bar'$content .= "--".MULTIPART_BOUNDARY."rn". "Content-Disposition: form-data; name="foo"rnrn". "barrn";// signal end of request (note the trailing "--")$content .= "--".MULTIPART_BOUNDARY."--rn";
如您所见,我们将发送
Content-Disposition带有
form-data配置的标头,以及
name参数(表单字段名称)和
filename参数(原始文件名)。
Content-Type如果要正确地填充内容,则发送具有正确的MIME类型的标头也很重要
$_FILES[]['type']。
如果要上载多个文件,则只需使用 $ content 位重复该过程,当然
FORM_FIELD每个文件都不同。
现在,构建上下文:
$context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => $header, 'content' => $content, )));
并执行:
file_get_contents('http://url/to/upload/handler', false, $context);注意: 发送二进制文件之前无需对其进行编码。HTTP可以很好地处理二进制文件。



