Home  >  Article  >  Backend Development  >  求指点PHP里的curl_exec问题

求指点PHP里的curl_exec问题

WBOY
WBOYOriginal
2016-06-23 13:53:071115browse

某网盘的压缩包rar格式外链有referer检测防盗链,本人想把它放到博客上供人下载,于是学习PHP伪造referer,但是得到的结果是一串乱码,估计是把压缩包以文本的形式输出了,本人是菜鸟,求大神指点如何让它以打开原连接的形式下载啊
我的代码如下:

<?php$url = '某个连接地址url.rar格式';$ch = curl_init(); //初始化curl_setopt($ch, CURLOPT_URL, $url); //你要访问的页面curl_setopt($ch, CURLOPT_REFERER, '某个来路url'); //伪造来路页面curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $content = curl_exec($ch); //执行curl_close($ch); //关闭echo $content;?>


回复讨论(解决方案)

你把这些得到的结果另存成rar格式,如果能打开,说明内容是对的。这样的话,只需要输出一下Header信息就可以了:

header("Content-type: application/octet-stream");Header("Content-Disposition: attachment; filename=download.rar" );

可能我刚才写有点问题,如果不行,再试试这种写法

header ( 'Content-type: application/rar' );header ( 'Content-Disposition: attachment; filename="downloaded.rar"' );

你把这些得到的结果另存成rar格式,如果能打开,说明内容是对的。这样的话,只需要输出一下Header信息就可以了:

header("Content-type: application/octet-stream");Header("Content-Disposition: attachment; filename=download.rar" );



用这个能下载打开,很感谢!
但是改变了原RAR的文件名称,比如原下载地址的rar名称是  电子书.rar   ,但是这个下载的就是download.rar,有什么办法让它保存为原名称吗?


你把这些得到的结果另存成rar格式,如果能打开,说明内容是对的。这样的话,只需要输出一下Header信息就可以了:

header("Content-type: application/octet-stream");Header("Content-Disposition: attachment; filename=download.rar" );



用这个能下载打开,很感谢!
但是改变了原RAR的文件名称,比如原下载地址的rar名称是  电子书.rar   ,但是这个下载的就是download.rar,有什么办法让它保存为原名称吗?
这个需要你自己分析下载地址的关系



你把这些得到的结果另存成rar格式,如果能打开,说明内容是对的。这样的话,只需要输出一下Header信息就可以了:

header("Content-type: application/octet-stream");Header("Content-Disposition: attachment; filename=download.rar" );



用这个能下载打开,很感谢!
但是改变了原RAR的文件名称,比如原下载地址的rar名称是  电子书.rar   ,但是这个下载的就是download.rar,有什么办法让它保存为原名称吗?
这个需要你自己分析下载地址的关系


你好,我不大懂php,或许我的这个方法不对。有什么方法伪造来路,然后直接打开原rar地址吗?


你把这些得到的结果另存成rar格式,如果能打开,说明内容是对的。这样的话,只需要输出一下Header信息就可以了:

header("Content-type: application/octet-stream");Header("Content-Disposition: attachment; filename=download.rar" );



用这个能下载打开,很感谢!
但是改变了原RAR的文件名称,比如原下载地址的rar名称是  电子书.rar   ,但是这个下载的就是download.rar,有什么办法让它保存为原名称吗?
原名称你自己去相应的地方获取,然后写到这里就行了。

$url = '某个连接地址url.rar格式'
这个 url 是你自己给的,如果你都不知道他的文件名是什么,那么别人有如何能知道
如果你知道,那么就把 download.rar 换掉就是了

$url = '某个连接地址url.rar格式';
如果这里的url里有文件名称,你直接提取出来用就行了。

$url = '某个连接地址url.rar格式'
这个 url 是你自己给的,如果你都不知道他的文件名是什么,那么别人有如何能知道
如果你知道,那么就把 download.rar 换掉就是了



那个rar的下载链接是个动态地址,我用了你第一种代码,点击后,下载为download.rar,而且下载过程显示未知大小,感觉我这个思路方法不大对,有好的思路么,只是伪造个来路,然后想直接打开原下载链接

其实

$url = '某个连接地址url.rar格式';$ch = curl_init(); //初始化curl_setopt($ch, CURLOPT_URL, $url); //你要访问的页面curl_setopt($ch, CURLOPT_REFERER, '某个来路url'); //伪造来路页面curl_setopt($ch, CURLOPT_HEADER, 1); curl_exec($ch); //执行
不就行了?

嗯,那样不行,头变成了正文。要这样
既然对方提供的是下载,那么相关信息自然已经都提供了,包括文件名和文件长度

$url = '/某个连接地址url.rar格式';$ch = curl_init(); //初始化curl_setopt($ch, CURLOPT_URL, $url); //你要访问的页面curl_setopt($ch, CURLOPT_REFERER, '某个来路url'); //伪造来路页面curl_setopt($ch, CURLOPT_HEADER, 1); //要读回 http 头curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'func'); //监听返回的数据curl_exec($ch); //执行function func($ch, $str) {  static $s = '@';  if($s) {    $s = trim($str);    if($s) header($s); //如果是头信息,则发送相应的头  }else echo $str; //否则发送数据  return strlen($str);}

其实

$url = '某个连接地址url.rar格式';$ch = curl_init(); //初始化curl_setopt($ch, CURLOPT_URL, $url); //你要访问的页面curl_setopt($ch, CURLOPT_REFERER, '某个来路url'); //伪造来路页面curl_setopt($ch, CURLOPT_HEADER, 1); curl_exec($ch); //执行
不就行了?



老大,这样出来的貌似是以文本形式输出来的,里面乱码一堆哦

对呀,我在 #11 不是已经更正了吗?
比你发现的还早,显然我对自己更负责任些

对呀,我在 #11 不是已经更正了吗?
比你发现的还早,显然我对自己更负责任些



用360和谷歌浏览器正常,
ie高版本的浏览器点击下载,文件名和后缀扩展名乱码了,能下载,但是文件类型都不显示,乱码是什么原因呢

中文文件名出现乱码是正常现象
服务端可能是gbk或utf-8 编码的
客户端也可能是gbk或utf-8 编码的
你需要在收到形如 Content-Disposition: attachment; filename=download.rar 这样的头信息时对其中中文文件名做一下判断,必要时根据客户端的字符集进行转码处理

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn