2012-03-16 40 views
2

我有一个页面集,我输入文件的URL,我有我的服务器下载该文件并将其保存到我的服务器上的文件夹。问题是我不知道如何将文件下载到我的服务器。我尝试了以下两种方法,但他们都没有工作。从外部链接远程下载文件到我的服务器 - 提前下载停止

这抛出了一个错误有关失败的开放式流:

$url = 'http://www.example.com/file.zip'; 
$enc = urlencode($url); 
$dir = "/downloads/file.zip"; 
$raw = file_get_contents($enc); 
file_put_contents($dir, $raw); 

这一个工作,但我只得到18KB了270KB的文件:(我曾试图增加超时)

set_time_limit(0); 

$url = 'http://www.eample.com/file.zip'; 
$fp = fopen ('/downloads/file.zip', 'w+'); 

    $ch = curl_init($url); 

    curl_setopt_array($ch, array(
    CURLOPT_URL   => $url, 
    CURLOPT_BINARYTRANSFER => 1, 
    CURLOPT_RETURNTRANSFER => 1, 
    CURLOPT_FILE   => $fp, 
    CURLOPT_TIMEOUT  => 50, 
    CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' 
    )); 

$results = curl_exec($ch); 
if(curl_exec($ch) === false) 
{ 
    echo 'Curl error: ' . curl_error($ch); 
} 
+0

我不知道这是否是问题,但我不得不将用户代理更改为过去常见的东西以使其工作。另外,请确保您使用的网址不只是重定向到您想要的真实文件的网址。 – gpojd 2012-03-16 00:43:54

+0

@gpojd你是什么意思。例如,当我将网址放入浏览器时,它不会将我带到一个网站,它只是开始下载。这是一个问题。 – DonJuma 2012-03-16 00:46:24

+0

在末尾添加'curl_close($ ch);'。 *可能*它有帮助。在它之后,放置'fflush($ fp); fclose($ fp);' - 检查返回值,请参阅这些函数的手册。顺便说一句'CURLOPT_RETURNTRANSFER => 1,'没有任何意义。你也可以告诉curl返回内容长度,用'curl_get_info'(或类似的)检查它,并与文件大小进行比较。 – hakre 2012-03-16 00:49:46

回答

2

这一个抛出了有关失败的开放式流的错误:

... 
$enc = urlencode($url); 
... 

我会说难怪,因为你不需要“urlencode”那个已经正确编码的url。请尝试:

$url = 'http://www.example.com/file.zip'; 
$file = "/downloads/file.zip"; 
$src = fopen($url, 'r'); 
$dest = fopen($file, 'w'); 
echo stream_copy_to_stream($src, $dest) . " bytes copied.\n"; 

请参阅stream_copy_to_stream­Docs。如果你需要设置更多的HTTP东西,如用户代理等使用HTTP Context Options­Docs

+0

这工作就像一个魅力。我将导致apk文件的原始URL更改为普通的jpg图片,并且工作正常。我猜其他网站否认了我的请求。谢谢。 – DonJuma 2012-03-16 01:02:28

+0

这也好多了,因为你不需要将变量(可能是大文件)存储在一个变量中来保存它。您还可以在流上注册回调,以便您可以了解幕后发生的更多情况。 – hakre 2012-03-16 02:04:33

+0

这个系统会使用我用来调用脚本的网络带宽还是从我的服务器网络使用带宽? – DonJuma 2012-03-16 02:33:31