我知道我可以很容易地用CURL做到这一点,但我想知道是否有可能使用file_get_contents()和http流上下文将文件上传到远程Web服务器,如果可以,怎么做?
file_get_contents()
55ooxyrt1#
首先,multipart Content-Type的第一个规则是定义一个边界,它将被用作每个部分之间的分隔符(因为正如名字所说,它可以有多个部分)。边界可以是 * 任何不包含在内容正文中的字符串 *。我通常会使用一个时间戳:
multipart
define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));
一旦定义了边界,您必须将其与Content-Type标头一起发送,以告知Web服务器预期使用的分隔符:
Content-Type
$header = 'Content-Type: multipart/form-data; boundary='.MULTIPART_BOUNDARY;
完成后,您必须构建一个与HTTP规范和发送的头匹配的适当的内容主体。如您所知,当从表单POST文件时,您通常会有一个表单字段名称。我们将定义它:
// 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."\r\n". "Content-Disposition: form-data; name=\"".FORM_FIELD."\"; filename=\"".basename($filename)."\"\r\n". "Content-Type: application/zip\r\n\r\n". $file_contents."\r\n"; // add some POST fields to the request too: $_POST['foo'] = 'bar' $content .= "--".MULTIPART_BOUNDARY."\r\n". "Content-Disposition: form-data; name=\"foo\"\r\n\r\n". "bar\r\n"; // signal end of request (note the trailing "--") $content .= "--".MULTIPART_BOUNDARY."--\r\n";
正如您所看到的,我们发送带有form-data配置的Content-Disposition头,沿着name参数(表单字段名)和filename参数(原始文件名)。如果您想正确地填充$_FILES[]['type'],发送带有正确MIME类型的Content-Type头也很重要。如果你有多个文件要上传,你只需要用 $content 位重复这个过程,当然,每个文件都有一个不同的FORM_FIELD。现在,构建上下文:
form-data
Content-Disposition
name
filename
$_FILES[]['type']
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可以很好地处理二进制文件。
kpbwa7wx2#
或者你也可以这样做:
$postdata = http_build_query( array( 'var1' => 'some content', 'file' => file_get_contents('path/to/file') ) ); $opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => $postdata ) ); $context = stream_context_create($opts); $result = file_get_contents('http://example.com/submit.php', false, $context);
将“/path/to/file”更改为相应的路径
ao218c7q3#
首先,多部分内容优先类型的要求是指定一个边界,该边界将用于将每个部分彼此分开。
3条答案
按热度按时间55ooxyrt1#
首先,
multipart
Content-Type的第一个规则是定义一个边界,它将被用作每个部分之间的分隔符(因为正如名字所说,它可以有多个部分)。边界可以是 * 任何不包含在内容正文中的字符串 *。我通常会使用一个时间戳:一旦定义了边界,您必须将其与
Content-Type
标头一起发送,以告知Web服务器预期使用的分隔符:完成后,您必须构建一个与HTTP规范和发送的头匹配的适当的内容主体。如您所知,当从表单POST文件时,您通常会有一个表单字段名称。我们将定义它:
然后我们构建内容主体:
正如您所看到的,我们发送带有
form-data
配置的Content-Disposition
头,沿着name
参数(表单字段名)和filename
参数(原始文件名)。如果您想正确地填充$_FILES[]['type']
,发送带有正确MIME类型的Content-Type
头也很重要。如果你有多个文件要上传,你只需要用 $content 位重复这个过程,当然,每个文件都有一个不同的
FORM_FIELD
。现在,构建上下文:
并执行:
**注意:**在发送二进制文件之前不需要编码。HTTP可以很好地处理二进制文件。
kpbwa7wx2#
或者你也可以这样做:
将“/path/to/file”更改为相应的路径
ao218c7q3#
首先,多部分内容优先类型的要求是指定一个边界,该边界将用于将每个部分彼此分开。