php curl上传无法在我的服务器上运行

时间:2013-01-25 06:22:00

标签: php file-upload curl

我的php curl上传脚本在localhost上成功运行,但在服务器上没有运行。 卷曲适用于简单的帖子,但不适用于发布文件。一旦我开始将文件添加到我的帖子数据(使用@作为文件路径前缀),它在服务器上没有显示任何内容($ _FILE& $ _POST都被发现未设置),而没有文件,则填充$ _POST。 我也在我的localhost和服务器上使用以下脚本。

$request_url = 'http://localhost/curl_upload/curl_upload_process.php';
$post_params['uploadfile'] = '@'.'D:\images\photo-b4.jpg';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
$result = curl_exec($ch);
curl_close($ch);

我已将request_url更改为服务器上的curl_upload_process.php文件。 它在localhost上工作正常,用于简单的帖子和文件上传,但不能在服务器上用于仅上传文件。请让我知道是什么导致问题出现在服务器上的脚本中。

2 个答案:

答案 0 :(得分:1)

很多挖掘后我发现你可以使用scp命令,它使用SSH(Secure SHell)协议,php有php在php代码中使用它,但你需要让服务器允许scp连接

<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>

更多细节可以在scp+php找到希望这可以帮助你:)。请根据您的需要进行更改

答案 1 :(得分:0)

我想问题是当服务器中的代码正在执行时是在@'.'D:\images\photo-b4.jpg';而不是从你的机器上归档文件

在localhost的情况下,您的计算机和服务器是相同的,因此它找到物理上位于@'.'D:\images\photo-b4.jpg';

的文件

如果您要上传文件,则需要在运行时提出整个Web表单请求并将其发布到服务器

尝试这样的事情: - 它不是你需要改变一点的确切代码

    $requestparameters["title"] = $filetitle;

    $content = file_get_contents($_FILES['uploadingfile']['tmp_name']);
    $filefieldname = (array_keys($_FILES));
    $delimiter = '-------------' . uniqid();
    $filefields = array(
    'file1' => array(
    'name' => $_FILES['uploadingfile']['name'],
    'type' => $_FILES['uploadingfile']['type'],
    'content' => $content),
    );
    $data = '';
    foreach ($requestparameters as $name => $value) {
        $data .= "--" . $delimiter . "\r\n";
        $data .= 'Content-Disposition: form-data; name="' . $name . '";' . "\r\n\r\n";
        // note: double endline
        $data .= $value . "\r\n";
    }
    foreach ($filefields as $name => $file) {
        $data .= "--" . $delimiter . "\r\n";
        // "filename" attribute is not essential; server-side scripts may use it
        $data .= 'Content-Disposition: form-data; name="' . $filefieldname['0'] . '";' .
        ' filename="' . $file['name'] . '"' . "\r\n";
        // this is, again, informative only; good practice to include though
        $data .= 'Content-Type: ' . $file['type'] . "\r\n";
        // this endline must be here to indicate end of headers
        $data .= "\r\n";
        // the file itself (note: there's no encoding of any kind)
        $data .= $file['content'];
   }
   $data .= "\r\n"."--" . $delimiter . "--\r\n";
   $str = $data;
   // set up cURL
   $ch=curl_init($url);
    curl_setopt_array($ch, array(
       CURLOPT_HEADER => false,
       CURLOPT_RETURNTRANSFER => true,
       CURLOPT_POST => true,
       CURLOPT_HTTPHEADER => array( // we need to send these two headers
            'Content-Type: multipart/form-data; boundary='.$delimiter,
            'Content-Length: '.strlen($str)
       ),
       CURLOPT_POSTFIELDS => $data,
   ));
   $ress =   curl_exec($ch);
   curl_close($ch);