cURL将文件上载到MS Windows上的远程服务器

时间:2011-01-31 00:38:19

标签: php windows linux curl upload

当我使用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 - 正常工作

5 个答案:

答案 0 :(得分:4)

如果您使用的是Windows,则文件路径分隔符将为\而不是Linux样式/

一个显而易见的尝试是

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

看看是否有效。

如果您想使您的脚本具有可移植性,以便它可以在Windows或Linux上运行,您可以使用PHP's predefined constant DIRECTORY_SEPARATOR

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

答案 1 :(得分:4)

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

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

在Windows 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

答案 2 :(得分:1)

您应该尝试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和Linux之间移植。 Windows,请考虑使用PHP's Predefined Constant 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

答案 3 :(得分:1)

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

取消注释行号952    即    如果行是

   ;extension=php_curl.dll

然后成功

  extension=php_curl.dll

答案 4 :(得分:1)

我认为,更好的方法是:

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