0

我的 php curl 上传脚本在 localhost 上成功运行,但在服务器上没有运行。curl 对于简单的发布工作正常,但不适用于发布文件。一旦我开始将文件添加到我的帖子数据(在文件路径前加上 @ 前缀),它在服务器上什么也没有显示($_FILE 和 $_POST 都未设置),而没有文件,$_POST 被填充。我也在我的本地主机和服务器上使用以下脚本。

$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 文件。它在本地主机上可以正常工作,用于简单的帖子和文件上传,但不能在服务器上仅用于文件上传。请让我知道是什么导致我的服务器上的脚本出现问题。

4

2 回答 2

1

嗨,经过大量挖掘后,我发现您可以使用 scp 命令,它使用 SSH(安全 SHell)协议,并且 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找到希望这可以帮助你:)。请根据您的需要进行更改

于 2013-01-25T12:16:10.787 回答
0

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

在本地主机的情况下,您的机器和服务器是相同的,因此它会找到物理上位于@'.'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);
于 2013-01-25T06:34:25.420 回答