【问题标题】:Fetching contents of a file that was sent through cURL POST获取通过 cURL POST 发送的文件的内容
【发布时间】:2014-01-22 14:59:28
【问题描述】:

所以经过一番研究,我发现可以通过cURL将文件发送到另一个页面。这是发送部分的代码:

$url = 'http://someabc.com/api.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
$postData = array(
    'array' => "@".realpath('array.txt'),
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$response = curl_exec($ch);

echo $response;

接收部分(api.php)

if(isset($_POST['array']))
{
    $string = $_POST['array'];
    echo $string;
}
else
{
    echo 'Not found';
}

当我运行包含 cURL 请求的页面时,我在页面上打印了Not found

这是否意味着我以错误的方式捕获数据?如果是这样,从api.php 页面获取array.txt 内容的方法是什么?

更新

按照 Jon 的建议使用 $_FILES 后,我收到了以下数组:

Array
(
    [name] => array.txt
    [type] => application/octet-stream
    [tmp_name] => /tmp/phpPQZXf9
    [error] => 0
    [size] => 77413
)

现在我尝试使用以下方法获取此文件的内容:

$tmp = $_FILES['array'];
$string = file_get_contents($tmp['name']['tmp_name']);

但收到错误Warning: file_get_contents(a) [function.file-get-contents]: failed to open stream: No such file or directory,这意味着我没有正确引用文件。我现在哪里出错了?

【问题讨论】:

  • $_FILES 数组中的任何内容?因为你正在尝试发送一个文件,所以数据应该放在这个位置而不是$_POST
  • 但是我没有使用<input type="file" />...只是从目录中提取一个文本文件并发送它。
  • 你正在发送一个文件——在接收端也是一样的。
  • 好的。我确实得到了一些东西。正在更新答案。
  • 您无法从tmp 直接访问该文件,为此,您必须使用move_uploaded_file(至少,通常您不应该这样做。)

标签: php file post curl


【解决方案1】:

对于更新前的第一部分,问题存在是因为在将文件发布到页面时,无论它发生的方法如何(即<input type='file />curl 等),PHP 始终可以通过$_FILES 变量,它是一个关联数组,在你的情况下,应该是 $_FILES['array'] 包含临时文件位置的信息。该数组应类似于:

Array 
(
    [array] => Array
    (
            [name] => array.txt
            [type] => encoding type
            [tmp_name] => /tmp/path/file
            [error] => 0 (if no error)
            [size] => [filesize]
    )
)

要从那里访问该文件,您需要将其从tmp 目录移动到您有权访问的目录中。这是通过move_uploaded_file 完成的。一个使用这个的例子是:

$upDir = 'uploads/';
move_uploaded_file($_FILES['array']['tmp_name'], $upDir. $_FILES['array']['name']);

从那里,该文件将位于服务器上 uploads/array.txt 中 php 文件的相对路径下,您可以在那里做任何事情。 ^^

【讨论】:

    【解决方案2】:

    如果您尝试发布文件,则数据将在 $_FILES 上可用。您可以使用以下代码进行检查

    var_dump($_FILES);
    

    如果您从 $_FILES 获取文件信息,则可以将您的检查“if(isset($_POST['array']))”替换为

    if(count($_FILES))
    {
        ...
    }
    else
    {
        echo 'Not found';
    }
    

    访问文件内容尝试:

    $tmp = $_FILES['array'];
    $string = file_get_contents($tmp['tmp_name']);
    

    【讨论】:

    • 是的,我已经越过了这个障碍。现在我正在尝试在接收端检索该文件的内容。
    • 谢谢祖拜尔。这有帮助。不幸的是,我只能选择 1 个答案,而且由于乔恩首先将我引向了正确的方向,所以我不得不和他一起去。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2011-10-24
    • 2011-05-12
    • 2013-04-02
    • 1970-01-01
    • 2012-08-15
    • 2010-09-19
    相关资源
    最近更新 更多