使用PHP Curl上传文件

时间:2014-10-17 05:23:00

标签: php curl

我需要将数据发送到我自己的服务器进行测试。 我发现了这样的实施。

 <?php 
        $data = array("a" => $a);
        $ch = curl_init($url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data));

        $response = curl_exec($ch);
        if(!$response) {
            return false;
        }
        else
        {
            echo"OK";
        }
?>

这说&#34; OK&#34;所以脚本正在运行。但是我该怎么发送文件呢?这是我的尝试: HTML:

  <form action="upload.php" method="put" enctype="multipart/form-data">
  <input type="file" name="filename"><br> 
  <input type="submit" value="Load"><br>
  </form>

PHP:

 <?php 
        $data = $_FILES['filename']['tmp_name']
        $ch = curl_init('http://xmpp1.feelinhome.ru/');

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data));

        $response = curl_exec($ch);
        if(!$response) {
            return false;
        }
        else
        {
            echo"OK";
        }
?>

这并没有说&#34; OK&#34;所以我的剧本错了。我的错误在哪里可以发送文件?

2 个答案:

答案 0 :(得分:0)

作为phihag states in their answer

  

根据HTML   标准,你可以。该方法唯一有效的值   属性为getpost,对应于GET和POST HTTP   方法。 <form method="put">是无效的HTML,我们将予以处理   例如<form>,即发送GET请求。

尝试将表单方法更改为发布

 <form action="upload.php" method="post" enctype="multipart/form-data">

同时设置为curl

curl_setopt($ch, CURLOPT_POST, 1);

答案 1 :(得分:0)

最好的答案是正确的,但错误的问题。对于html表单是的,你只能使用GET和POST,但你没有问你如何根据html标准来做。您始终可以通过XHR请求使用PUT和DELETE。当然,这里最好的答案并没有触及事实的另一部分,因为相应的超级全局变量不可用,所以php不能正确支持PUT和DELETE请求。为了使事情有效,您应该使用stream class gist here。确保您使用我的版本,因为我稍微修改了它,以便正确上传文件并按预期设置$ _files超级全局。然后在您的客户端,您应该以这种方式执行ajax请求:

  var formData =new FormData($('form')[0]);
  $.ajax({
        type: "PUT",
        //in this example we put on the current uri
        url: 'upload.php',
        dataType: 'json',
        data: formData,
        async:false,
        cache:false,
        contentType:false,
        processData:false,
        }).done(function(data) {
          //whatever happens on sucess goes here
       ).fail(function(){
          //whatever happens on failure goes here
        });

可以找到关于缺少此功能以及问题与RFC 2616的相关性的讨论here