2011-01-31 181 views
5

当我使用linux并尝试使用此脚本将文件上传到远程服务器时,一切正常。但是,如果我使用Windows,那么脚本不工作。 脚本:cURL将文件上传到MS 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工作

+0

你有没有在你的PHP安装编译卷曲在你的Windows服务器上?显示给出的错误信息。您可以通过[phpinfo()](http://php.net/manual/en/function.phpinfo.php)脚本检查安装。 – Orbling 2011-01-31 00:40:58

+0

错误未显示。 (error_reporting = on) – Dador 2011-01-31 00:46:41

+0

getcwd()不会以斜线结尾返回,所以我错过了那个,除此之外不应该在Windows上使用反斜杠而不使用反斜杠? – 2011-01-31 00:48:02

回答

4

,你的文件路径分隔符会\不是Linux的风格/。尝试

一个明显的一点是

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

,看看是否有效。

如果你想使你的脚本方便携带,因此它完全可以在与Windows或Linux,你可以使用PHP's predefined constantDIRECTORY_SEPARATOR

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

从理论上讲,你的代码应该是不行的(我的意思是上传)在任何,UNIX或窗户。从你的代码考虑此部分:

'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

1

你应该尝试var_dump($body)看到什么$body的确不包含。通过配置cURL的方式,$body将包含服务器的响应或失败时的错误。没有办法区分echo的空响应或虚假。这可能是请求正在通过,服务器只是没有返回。

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

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

例如,如果你想POST文件驻留在同一文件夹作为你的PHP脚本:

$post = array('image' => '@image.jpg');就足够了。如果与工作使用PHP's Predefined ConstantDIRECTORY_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

1

$post = array('image' => '@/home/youruser/yourdomain/image.jpg');

至于特伦斯说,如果你需要你的代码跨Linux &的Windows是便携式的,可以考虑:如果需要,提供绝对路径xampp 确保在php.ini配置文件中

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

;extension=php_curl.dll 

然后使它

extension=php_curl.dll 
1

我认为,更好的办法是:

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