为什么我的 php 上传不起作用?
Why does my php upload not work?
TL;DR:为什么重新上传上传的数据不起作用?
我正在尝试将用户上传到我的文件的数据上传到另一台服务器。这意味着,我想 post 我的 post 数据。
我想上传一些数据到 upload.php
,然后应该 posted 到 test.php
(它只是输出原始的 post 数据)。由于节省内存,我希望它能够在不将 post 整个消息生成为字符串的情况下工作。因此我也不想使用 curl。
test.php
<?php
echo 'foo', file_get_contents('php://input'), 'bar';
upload.php
<?php
//new line variable
$NL = "\r\n";
//open the posted data as a resource
$client_upload = fopen('php://input', 'r');
//open the connection to the other server
$server_upload = fsockopen('ssl://example.com', 443);
//write the http headers to the socket
fwrite($server_upload, 'POST /test.php HTTP/1.1' . $NL);
fwrite($server_upload, 'Host: example.com' . $NL);
fwrite($server_upload, 'Connection: close' . $NL);
//header/body divider
fwrite($server_upload, $NL);
//loop until client upload reached the end
while (!feof($client_upload)) {
fwrite($server_upload, fread($client_upload, 1024));
}
//close the client upload resource - not needed anymore
fclose($client_upload);
//intitalize response variable
$response = '';
//loop until server upload reached the end
while (!feof($server_upload)) {
$response .= fgets($server_upload, 1024);
}
//close the server upload resource - not needed anymore
fclose($server_upload);
//output the response
echo $response;
当我post { "test": true }
(来自Fiddler)到test.php
文件时,它输出foo{ "test": true }bar
。
现在,当我尝试对 upload.php
执行相同操作时,我只得到 foobar
(以及来自 test.php
的 http headers),但没有得到上传的内容。
最后我设法修复这个错误。显然其他服务器(和我的)依赖于 http header Content-Length
.
正如您在我的回答中看到的那样,我没有发送(也没有计算)这个 header。因此,当我终于计算并发送 Content-Length
header 时,一切正常。这是缺少的行:
$content_length = fstat($client_upload)['size'];
fwrite($server_upload, 'Content-Length: ' . $content_length . $NL);
重新上传(上传到我的服务器的数据)没有成功,因为其他服务器只是读取 body 只要它在 Content-Length
[=25= 中指定].因为我没有发送这个 header,它没有用。
TL;DR:为什么重新上传上传的数据不起作用?
我正在尝试将用户上传到我的文件的数据上传到另一台服务器。这意味着,我想 post 我的 post 数据。
我想上传一些数据到 upload.php
,然后应该 posted 到 test.php
(它只是输出原始的 post 数据)。由于节省内存,我希望它能够在不将 post 整个消息生成为字符串的情况下工作。因此我也不想使用 curl。
test.php
<?php
echo 'foo', file_get_contents('php://input'), 'bar';
upload.php
<?php
//new line variable
$NL = "\r\n";
//open the posted data as a resource
$client_upload = fopen('php://input', 'r');
//open the connection to the other server
$server_upload = fsockopen('ssl://example.com', 443);
//write the http headers to the socket
fwrite($server_upload, 'POST /test.php HTTP/1.1' . $NL);
fwrite($server_upload, 'Host: example.com' . $NL);
fwrite($server_upload, 'Connection: close' . $NL);
//header/body divider
fwrite($server_upload, $NL);
//loop until client upload reached the end
while (!feof($client_upload)) {
fwrite($server_upload, fread($client_upload, 1024));
}
//close the client upload resource - not needed anymore
fclose($client_upload);
//intitalize response variable
$response = '';
//loop until server upload reached the end
while (!feof($server_upload)) {
$response .= fgets($server_upload, 1024);
}
//close the server upload resource - not needed anymore
fclose($server_upload);
//output the response
echo $response;
当我post { "test": true }
(来自Fiddler)到test.php
文件时,它输出foo{ "test": true }bar
。
现在,当我尝试对 upload.php
执行相同操作时,我只得到 foobar
(以及来自 test.php
的 http headers),但没有得到上传的内容。
最后我设法修复这个错误。显然其他服务器(和我的)依赖于 http header Content-Length
.
正如您在我的回答中看到的那样,我没有发送(也没有计算)这个 header。因此,当我终于计算并发送 Content-Length
header 时,一切正常。这是缺少的行:
$content_length = fstat($client_upload)['size'];
fwrite($server_upload, 'Content-Length: ' . $content_length . $NL);
重新上传(上传到我的服务器的数据)没有成功,因为其他服务器只是读取 body 只要它在 Content-Length
[=25= 中指定].因为我没有发送这个 header,它没有用。