我正在请求一个像(Rapidshare)这样的网站,在响应中给我请求的文件或一些HTML告诉我需要等待xx秒才能下载文件。在我很困惑如何编码这个场景。
现在,如果我使用HTML表单发布,在其中设置一些字段,然后使用Javascript自动提交到目标站点。如果成功,则提示用户是否要下载该字段,如果由于用户需要等待等原因失败,则将用户带到那个站点 URL。
避免用户重定向到目标站点错误页面。我使用CURL,它发送POST请求并读取响应。现在,问题是,如果CURL请求的响应是一个文件,页面会一直加载,直到服务器上下载了响应中接收到的整个文件并存储在该变量中。
这个函数用$headerz作为头值在$url上发出curl请求,$encoded是请求参数
function makeCurlPostRequest($url, $headerz, $encoded){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if($headerz!=null)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerz);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
if($encoded!=null)
curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_AUTOREFERER, 0);
curl_setopt($ch, CURLOPT_REFERER, $url);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
function checkUrl($file,$url,$headerz){
$post_data = array ( "premium_acc" => "checked",
"linkx" => "$file"
);
$encoded = '';
foreach($post_data as $name => $value) {
$encoded .= urlencode($name).'='.urlencode($value).'&';
}
$scrapHTML = makeCurlPostRequest($url, $headerz, $encoded);
return $scrapHTML;
}
CheckUrl,有3个参数,$file要下载的文件链接,$url请求的url和$headerz是头值。
现在我上传了一个测试文件a.txt
与内容ABCDABCDABCD
然后在Web浏览器上成功发出请求并使用ti打印响应后,输出如下
HTTP/1.1 200 OK日期:Fri, 08 july 201107:25:43 GMT服务器:Apache/2.2.16(Debian) X-Powered-By:PHP/5.3.3-7+squeeze1过期:周一,261997年7月05:00:002011年7月8日星期五07:25:43GMTcache - control: no - cache,必须重新验证Pragma: no-cache附加:文件名= " a.txt "Connection: close接受范围:bytesContent-Length: 1应用程序/force-downloadABCDABCDABCD
其中ABCDABCDABCD为TXT文件的内容。如果它是一个音频文件,它会在完全下载后输出一些随机字符。
我需要提示用户下载这些数据,而不是首先将其保存在服务器上或在变量中。
是否有一种方法,我可以检查响应头,如果返回的是一个文件,如果一个文件,然后提示用户下载。
有这个旋度方法的解吗?
或
<form action="d.php" method="POST">
<input type="hidden" name ="url" value="<?php echo $url;?>"/>
<?php
foreach($scrapHTML->find('input') as $field) {
$name = $field->name;
$value = $field->value;
?>
<input type="hidden" name ="<?php echo $name;?>" value="<?php echo $value;?>"/>
<?php
}
?>
</form>
<script type="text/javascript">
void(document.forms[0].submit());
</script>
这个HTML表单将请求发送到目标URL,并成功提示用户下载文件,但问题是,如果出现错误,它会将用户带到那个网站错误或等待页面,我不想让用户看到。
请提供一个解决方案,无论是使用curl还是使用HTML表单post。
问候,aqif
$opts = array ( 'http' => array ( 'max_redirects' => 1, 'ignore_errors' => 1 ) );
stream_context_get_default ( $opts );
$headers = get_headers ( $url, true );
if ( strstr ( $headers [ 'Content-Type' ], 'text/html' ) ){
....... DO YOUR CODE ..........
}
编辑:设置这个发送POST变量
$postdata = http_build_query(
array(
'var1' => 'some content',
'var2' => 'doh'
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
stream_context_get_default ( $opts );
$headers = get_headers ( $url, true );
if ( strstr ( $headers [ 'Content-Type' ], 'text/html' ) ){
....... DO YOUR CODE ..........
}