PHP: 用file_put_content保存wget返回的文件
PHP: Save the file returned by wget with file_put_content
我正在用 cURL 和 returns 变量中的内容替换下载文件的函数,然后在函数外部代码将此变量写入带有 file_put_content 的文件。
由于系统的要求,我现在必须使用wget,所以我使用这样的东西:
function GetData($strdata,$wwwurl){
$content = exec("wget --post-data '".$strdata."' -qO- ".$wwwurl);
return $content;
}
但是当我稍后使用file_put_content 来保存$content 的内容时,文件的大小比它应该的要小得多(1kb 应该是480kb 左右)。
我无法删除 file_put_content,因为它在代码的多个位置使用(这会花费我们很长时间),而且我只能编辑该函数。
如果我使用“-O test.zip”而不是“-O-”启动 wget,文件会被下载并保存得很好,如果我从命令行启动命令,也会发生同样的情况。
有什么想法吗?
这是因为 exec
没有 return 整个数据。看看文档
https://www.php.net/manual/en/function.exec.php :
Return Values: The last line from the result of the command.
但是 shell_exec
(或者只是反引号)return 的全部数据:https://www.php.net/manual/en/function.shell-exec.php .
示例:
<?php
$url = 'https://file-examples-com.github.io/uploads/2017/02/zip_5MB.zip';
$content = exec("wget -qO- $url");
var_dump(strlen($content));
$content2 = shell_exec("wget -qO- $url");
var_dump(strlen($content2));
file_put_contents('1.zip', $content);
file_put_contents('2.zip', $content2);
输出:
int(208)
int(5452018)
2.zip 有效(所有 5MB 数据),1.zip 显然无效(只是末尾的一些字节)。
所以不要将 exec
的 return 值视为命令的整个输出。
我正在用 cURL 和 returns 变量中的内容替换下载文件的函数,然后在函数外部代码将此变量写入带有 file_put_content 的文件。 由于系统的要求,我现在必须使用wget,所以我使用这样的东西:
function GetData($strdata,$wwwurl){
$content = exec("wget --post-data '".$strdata."' -qO- ".$wwwurl);
return $content;
}
但是当我稍后使用file_put_content 来保存$content 的内容时,文件的大小比它应该的要小得多(1kb 应该是480kb 左右)。 我无法删除 file_put_content,因为它在代码的多个位置使用(这会花费我们很长时间),而且我只能编辑该函数。 如果我使用“-O test.zip”而不是“-O-”启动 wget,文件会被下载并保存得很好,如果我从命令行启动命令,也会发生同样的情况。 有什么想法吗?
这是因为 exec
没有 return 整个数据。看看文档
https://www.php.net/manual/en/function.exec.php :
Return Values: The last line from the result of the command.
但是 shell_exec
(或者只是反引号)return 的全部数据:https://www.php.net/manual/en/function.shell-exec.php .
示例:
<?php
$url = 'https://file-examples-com.github.io/uploads/2017/02/zip_5MB.zip';
$content = exec("wget -qO- $url");
var_dump(strlen($content));
$content2 = shell_exec("wget -qO- $url");
var_dump(strlen($content2));
file_put_contents('1.zip', $content);
file_put_contents('2.zip', $content2);
输出:
int(208)
int(5452018)
2.zip 有效(所有 5MB 数据),1.zip 显然无效(只是末尾的一些字节)。
所以不要将 exec
的 return 值视为命令的整个输出。