cURL将文件上传到MS Windows上的远程服务器
当我使用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工作
,你的文件路径分隔符会\
不是Linux的风格/
。尝试
一个明显的一点是
$post=array('image'=>'@'.getcwd().'images\image.jpg');
,看看是否有效。
如果你想使你的脚本方便携带,因此它完全可以在与Windows或Linux,你可以使用PHP's predefined constantDIRECTORY_SEPARATOR
$post=array('image'=>'@'.getcwd().'images' . DIRECTORY_SEPARATOR .'image.jpg');
从理论上讲,你的代码应该是不行的(我的意思是上传)在任何,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
你应该尝试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);
$post = array('image' => '@/home/youruser/yourdomain/image.jpg');
至于特伦斯说,如果你需要你的代码跨Linux &的Windows是便携式的,可以考虑:如果需要,提供绝对路径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);
你有没有在你的PHP安装编译卷曲在你的Windows服务器上?显示给出的错误信息。您可以通过[phpinfo()](http://php.net/manual/en/function.phpinfo.php)脚本检查安装。 – Orbling 2011-01-31 00:40:58
错误未显示。 (error_reporting = on) – Dador 2011-01-31 00:46:41
getcwd()不会以斜线结尾返回,所以我错过了那个,除此之外不应该在Windows上使用反斜杠而不使用反斜杠? – 2011-01-31 00:48:02