当我使用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);