cURL将file upload到MS Windows上的远程服务器

当我使用Linux并尝试使用这个脚本上传文件到远程服务器,那么一切都很好。 但是,如果我使用Windows然后脚本不工作。 脚本:

$url="http://site.com/upload.php"; $post=array('image'=>'@'.getcwd().'images/image.jpg'); $this->ch=curl_init(); curl_setopt($this->ch, CURLOPT_URL, $url); curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->ch, CURLOPT_TIMEOUT, 30); curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($this->ch, CURLOPT_POST, 1); curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); $body = curl_exec($this->ch); echo $body; // << on Windows empty result 

我究竟做错了什么?

PHP 5.3

Windows 7 – 不工作,Ubuntu Linux 10.10 – 工作

如果你使用Windows,你的文件路径分隔符将不是Linux风格。

一个显而易见的事情是尝试

 $post=array('image'=>'@'.getcwd().'images\image.jpg'); 

看看是否有效。

如果你想让你的脚本可移植,所以它可以在Windows或Linux上运行,你可以使用PHP的预定义的常量 DIRECTORY_SEPARATOR

 $post=array('image'=>'@'.getcwd().'images' . DIRECTORY_SEPARATOR .'image.jpg'); 

从理论上讲,你的代码不应该在任何,Unix或Windows中工作(我的意思是上传)。 考虑你的代码中的这部分:

 'image'=>'@'.getcwd().'images/image.jpg' 

在窗口中getcwd()返回F:\Work\temp
在Linux中它返回/root/work/temp

所以,你的上面的代码将编译如下:

Windows: 'image'=>'@F:\Work\tempimages/image.jpg'
Linux: 'image'=>'@/root/work/tempimages/image.jpg'

既然你提到它在linux中的工作,这意味着/root/work/tempimages/image.jpg以某种方式存在于你的文件系统。

我的PHP版本:
Linux: PHP 5.1.6
Windows: PHP 5.3.2

您应该尝试var_dump($body)来查看$body真正包含的内容。 通过配置cURL的方式, $body将包含服务器的响应或者失败时的false。 没有办法区分空回应或echo错误。 这个请求可能会很好,服务器只是没有返回。

但是,正如其他人所说,你的文件路径似乎无效。 getcwd()不输出最后一个/ ,你将需要添加一个使代码工作。 既然你说过它在linux上工作,即使没有缺少斜杠,我想知道如何找到你的文件。

我建议你创建一个相对于正在运行的PHP脚本文件的路径,或者提供一个绝对路径,而不是依靠getcwd() ,这可能不会返回你所期待的。 getcwd()的值在系统中是不可预知的,并且不是很便携。

例如,如果您正在尝试POST的文件与您的PHP脚本位于相同的文件夹中:

$post = array('image' => '@image.jpg'); 足够了。 如果需要,提供一个绝对路径: $post = array('image' => '@/home/youruser/yourdomain/image.jpg');

Terence说,如果你需要你的代码在Linux和Windows上移植,可以考虑使用PHP的预定义常量 DIRECTORY_SEPARATOR

 $url = "http://yoursite.com/upload.php"; // images\image.jpg on Windows images/image.jpg on Linux $post = array('image' => '@images'.DIRECTORY_SEPARATOR.'image.jpg'); $this->ch = curl_init(); curl_setopt($this->ch, CURLOPT_URL, $url); curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->ch, CURLOPT_TIMEOUT, 30); curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($this->ch, CURLOPT_POST, 1); curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); $body = curl_exec($this->ch); var_dump($body); 

getcwd() cURL

如果使用xampp请确保在php.ini配置文件中

行号952是未注释的,即如果行是

  ;extension=php_curl.dll 

然后做出来

  extension=php_curl.dll 

我认为,更好的方法是:

 $imgpath = implode(DIRECTORY_SEPARATOR, array(getcwd(), 'images', 'image.jpg')); $post = array('image'=>'@'.$imgpath);