使用file_get_contents上传文件

我意识到我可以非常轻松地使用CURL做到这一点,但是我想知道是否可以file_get_contents()与http流上下文一起使用,以将文件上传到远程Web服务器,如果可以,怎么办?

回答:

首先,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."\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";

如您所见,我们将发送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可以很好地处理二进制文件。

以上是 使用file_get_contents上传文件 的全部内容, 来源链接: utcz.com/qa/425699.html

回到顶部