Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从外部url下载文件,并将文件直接传递给用户,而无需将其保存在我的服务器上。_Php_Url_Download_External - Fatal编程技术网

Php 从外部url下载文件,并将文件直接传递给用户,而无需将其保存在我的服务器上。

Php 从外部url下载文件,并将文件直接传递给用户,而无需将其保存在我的服务器上。,php,url,download,external,Php,Url,Download,External,基本上,我想从外部主机下载一个文件,并将其直接传递给用户,而不必保存在服务器上。实际上,我想充当该文件的代理,因此请求总是从我的服务器发出,而不是从用户发出。 我是否应该模拟此请求: GET / servername / filename.ext HTTP/1.1 (any large file) Host: namehost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 27.0) Gecko/20100101 Firefox/27

基本上,我想从外部主机下载一个文件,并将其直接传递给用户,而不必保存在服务器上。实际上,我想充当该文件的代理,因此请求总是从我的服务器发出,而不是从用户发出。 我是否应该模拟此请求:

GET / servername / filename.ext HTTP/1.1 (any large file) 
Host: namehost 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 27.0) Gecko/20100101 Firefox/27.0 
Accept: text / html, application / xhtml + xml, application / xml; q = 0.9, * / * q = 0.8 
Accept-Language: en-us, en; q = 0.8, en-US; q = 0.5, en; q = 0.3 
Accept-Encoding: gzip, deflate 
Referer: sitename / ... 
Cookie: .... 
Connection: keep-alive 
我已经有了必要的cookie和所有必要的头文件,但是我无法开始下载,我尝试在Curl中使用不同的脚本,但是下载没有开始


有人能帮我吗。

您只需将要下载的文件的URI设置为超链接的值:

<a href="URI" target="_blank">Click to download</a>

如果您不想让他们单击任何内容,并立即下载文件,可以使用php header()函数。
请参见此处的示例1:

您希望从远程服务器获取文件并将其提供给您的用户。下面是获取和服务代理的示例代码。我希望您知道文件名、URL、文件扩展名和mime类型

<?php
function get_size($url) {
    $my_ch = curl_init();
    curl_setopt($my_ch, CURLOPT_URL,$url);
    curl_setopt($my_ch, CURLOPT_HEADER, true);
    curl_setopt($my_ch, CURLOPT_NOBODY, true);
    curl_setopt($my_ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($my_ch, CURLOPT_TIMEOUT, 10);
    $r = curl_exec($my_ch);
    foreach(explode("\n", $r) as $header) {
        if(strpos($header, 'Content-Length:') === 0) {
            return trim(substr($header,16));
        }
    }
    return '';
}
// Set operation params
$mime = filter_var($_GET['mime']);
$ext = str_replace(array('/', 'x-'), '', strstr($mime, '/'));
$url = base64_decode(filter_var($_GET['url']));
$name = urldecode($_GET['title']). '.' .$ext;

// Fetch and serve
if ($url)
{
$size=get_size($url);
// Generate the server headers
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE)
{
header('Content-Type: "' . $mime . '"');
header('Content-Disposition: attachment; filename="' . $name . '"');
header('Expires: 0');
header('Content-Length: '.$size);
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Transfer-Encoding: binary");
header('Pragma: public');
}
else
{
header('Content-Type: "' . $mime . '"');
header('Content-Disposition: attachment; filename="' . $name . '"');
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Content-Length: '.$size);
header('Pragma: no-cache');
}

readfile($url);
exit;
}

// Not found
exit('File not found');
?>

它将像一个魅力

您需要为回复提供一些代码感谢,但是通过这样做,他们直接调用包含来自浏览器的文件的主机,但是我希望请求通过我的服务器。我想这样:客户端用户->呼叫我的服务器->外部主机文件外部主机响应文件->我的服务器->用户下载我希望我能更好地解释我自己。谢谢你的回答,你的方法很有效,但我不确定您是否使用我的服务器的带宽进行下载,因为控制我的服务器中使用的带宽保持不变。还有一件事是可能隐藏源于用户的url?再次感谢您的回答无论您使用何种方法,您的服务器BW都将消耗。您的服务器就像一个代理。取回并提供服务是有代价的。您可以使用base64_编码隐藏url,并使用base64_解码检索url。谢谢,在您的帮助下,我能够理解并执行我想要的操作;),我还想问你一件事,如果你能帮助我理解,使用这种方法,链接是以这种方式创建的htttp://serverexterno/linkname如果我想要下载链接,那么用户应该可以这样做吗?基本上你在我的服务器上下载文件并立即传递给用户,但是使用新的网址,并且在下载后在一定时间内不会被删除?基本上你不想向用户显示确切的URL,对吗?如果是,则可以使用base64_编码隐藏url,并使用base64_解码检索url。参见上面的示例,我已经更新了代码非常感谢,你已经建议我使用base64_encode,并且非常成功,我现在想做的是将文件扔到我的服务器上,然后用户无需下载,但必须再次单击从外部链接下载,或多或少像服务的水蛭一样,在他们的服务器上创建链接,我希望我现在能更好地解释自己。感谢您抽出时间,您的回答非常有用,并对我进行了很好的解释,以更好地理解我对php的疑虑;)
$encoded_url =  base64_encode($file_to_download_url);
$download_url = 'http://www.example.com/download.php?mime='.$mime.'&title='.$title.'&url='.$encoded_url;