Php 使用文件获取内容上载文件

Php 使用文件获取内容上载文件,php,file-upload,file-get-contents,Php,File Upload,File Get Contents,我意识到我可以很容易地使用CURL实现这一点,但我想知道是否可以使用http流上下文中的file\u get\u contents()将文件上载到远程web服务器,如果可以,如何实现?首先,multipart内容类型的第一条规则是定义一个边界,该边界将用作每个部分之间的分隔符(因为顾名思义,它可以有多个部分)。边界可以是内容体中未包含的任何字符串。我通常会使用时间戳: define('MULTIPART_BOUNDARY', '--------------------------'.microt

我意识到我可以很容易地使用CURL实现这一点,但我想知道是否可以使用http流上下文中的
file\u get\u contents()
将文件上载到远程web服务器,如果可以,如何实现?

首先,
multipart
内容类型的第一条规则是定义一个边界,该边界将用作每个部分之间的分隔符(因为顾名思义,它可以有多个部分)。边界可以是内容体中未包含的任何字符串。我通常会使用时间戳:

define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));
定义边界后,必须将其与
内容类型
标题一起发送,以告知Web服务器所需的分隔符:

$header = 'Content-Type: multipart/form-data; boundary='.MULTIPART_BOUNDARY;
完成后,必须构建与HTTP规范和发送的头相匹配的适当内容体。正如您所知,当从表单发布文件时,通常会有一个表单字段名。我们将定义它:

// equivalent to <input type="file" name="uploaded_file"/>
define('FORM_FIELD', 'uploaded_file'); 
如您所见,我们正在发送
内容处置
标题和
表单数据
处置,以及
名称
参数(表单字段名称)和
文件名
参数(原始文件名)。如果要正确填充
$\u文件[]['Type']
内容类型,则发送带有正确MIME类型的
标题也很重要

如果要上载多个文件,只需使用$content位重复该过程,当然,每个文件都有一个不同的
FORM_字段

现在,构建上下文:

$context = stream_context_create(array(
    'http' => array(
          'method' => 'POST',
          'header' => $header,
          'content' => $content,
    )
));
并执行:

file_get_contents('http://url/to/upload/handler', false, $context);

注意:在发送二进制文件之前,无需对其进行编码。HTTP可以很好地处理二进制文件。

或者您可以只执行以下操作:

$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”更改为适当的路径

您是指file\u put\u contents()?不。尝试使用URL执行文件内容,您将得到“HTTP包装器不支持可写连接”,但使用文件内容()您可以下载文件,而不是上载!?如何使用文件_get_contents()写入流?:?事实上,HTTP流包装器总是写入流,因为HTTP调用同时包含请求(写入)和响应(读取)。哇,答案太棒了。我今晚会试试这个,效果很好。您是否有可能在回答中添加如何在上传时添加额外的帖子字段?还有,仅仅通过在另一个边界上加钉就可以这样做多次吗?当然可以。有关帖子字段,请参阅我的更新答案。至于你的第二个问题,我不知道你的意思。谢谢你的更新。我的意思是,我可以同时上传两个文件,方法是加上另一个:$content=“-->.MULTIPART\u BOUNDARY.\r\n”。“内容配置:表单数据;名称=\”表单字段\ 2\“文件名=\”.basename($otherFileName)。“\”\r\n”。“内容类型:图像/jpeg\r\n\r\n”$其他文件内容。“\r\n”;如果要发送的文件非常大,是否无法发送数据块?
$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);