2013-07-18 44 views
0

我试图点击返回二进制数据并用于保存文件的url。当我尝试使用file_put_contents文件得到生成,但内容是空的或文件说它已损坏。php下载一个curl文件,返回二进制数据

$url_call = 'http://someurl.com/file/15646'; 

$ch=curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url_call); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
curl_setopt($ch, CURLOPT_HEADER,0); 
$response = curl_exec($ch); 
curl_close($ch); 


file_put_contents('/data/testingdirect.pdf', $response); 

我知道那里有很多问题在那里相似,IV通过所有的人都看着,想他们,但他们都返回相同的结果的损坏或空文件。

我知道该文件是好的,因为我可以直接在服务器上直接访问该文件,并发现它很好。

也有一种方法可以让我确定文件类型或内容类型,以了解如何保存fil或pdf或jpeg或其他任何文件。

改写卷曲是这样的:

$fp = fopen ('/data/testingdirect.jpg', 'w+'); 
$ch=curl_init(); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_URL, $url_call); 
curl_setopt($ch, CURLOPT_HEADER,0); 

$response = curl_exec($ch); 
curl_close($ch); 
fclose($fp); 

和同样的事情仍在发生。

+0

当您尝试将'testingdirect.pdf'作为纯文本查看时会发生什么? (下载的文件 - >用记事本编辑)还有'BINARYTRANSFER'尝试'false'? –

+0

我看到的二进制数据 HTTP/1.1 200 OK 的Last-Modified:星期三,2013年7月17日20时36分05秒GMT 的Etag:af362918b9ee35b969cdsfdfe4db2b0e7 接受-范围:字节 的Content-Length:3906609 内容类型: image/jpeg 日期:2013年7月18日星期四22:55:17 GMT – Yeak

回答

1

打开文件句柄,然后将其传递给CURLOPT_FILE。

$tempFP = fopen('/data/testingdirect.pdf', 'w+'); 
curl_setopt($ch, CURLOPT_FILE , $tempFP); 

当你做你的卷曲EXEC,结果将进入该文件指针

不要忘记关闭文件句柄

-1

如果您的网址是安全,那么你可能需要SSL_VERIFYPEER设为假;

$file = 'file.txt'; 
$url = 'example.com/'; 
$fp = fopen($file, 'w'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 20); 
curl_setopt($ch, CURLOPT_HEADER , false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST , false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION , true); 
curl_setopt($ch, CURLOPT_AUTOREFERER , true); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12'); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
$con = curl_exec($ch); 
curl_close($ch);