使用PHP将远程文件下载到服务器



在过去的两天里,我到处寻找,尝试了一切,但仍然无法找到任何工作。我觉得这应该是一件相对简单的事情

我所想做的就是将一个远程文件从URL下载到服务器上的一个目录。

例如,如果

$_url = http://www.freewarelovers.com/android/download/temp/1306495040_Number_Blink_1.1.1.apk

$_dir = /www/downloads/

然后,当一切都说了又做了时,我希望1306495040_Number_Blink_1.1.1.apk/www/downloads/

我试过copy()功能,我试过

file_put_contents("$_dir.$_file_name", file_get_contents($_url));

并得到以下错误:

file_get_contents(): failed to open stream: HTTP request failed!

这应该做到:

set_time_limit(0);
$url = 'http://www.freewarelovers.com/android/download/temp/1306495040_Number_Blink_1.1.1.apk';
$file = fopen(dirname(__FILE__) . '/downloads/a.apk', 'w+');
$curl = curl_init();
// Update as of PHP 5.4 array() can be written []
curl_setopt_array($curl, [
    CURLOPT_URL            => $url,
//  CURLOPT_BINARYTRANSFER => 1, --- No effect from PHP 5.1.3
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FILE           => $file,
    CURLOPT_TIMEOUT        => 50,
    CURLOPT_USERAGENT      => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'
]);
$response = curl_exec($curl);
if($response === false) {
    // Update as of PHP 5.3 use of Namespaces Exception() becomes Exception()
    throw new Exception('Curl error: ' . curl_error($curl));
}
$response; // Do something with the response.
$url  = 'http://www.example.com/a-large-file.zip';
$path = '/path/to/a-large-file.zip';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
file_put_contents($path, $data);

它使用卷曲

$url是文件url

$path是保存文件的位置和名称

我希望它能正常工作

自PHP 5.1.0以来,file_put_contents()通过传递流句柄作为$data参数来支持逐段写入:
无需使用卷曲

file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));

使用curl从远程服务器下载文件,如下所示。

$url = "http://path/toserver/filename";
$destination = "uploads/filename";    
$fp = fopen ($destination, 'w+');
  $ch = curl_init();
  curl_setopt( $ch, CURLOPT_URL, $url );
  curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
  curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
  curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
  curl_setopt( $ch, CURLOPT_FILE, $fp );
  curl_exec( $ch );
  curl_close( $ch );
  fclose( $fp );

参考http://www.tricksofit.com/2014/04/download-file-from-remote-server-in-php

file_put_contents需要一个文件名,而不是目录名。

将其分为不同阶段:

$raw = file_get_contents($_url);
... check if $raw has anything useful in it
file_put_contents($_dir, $raw);
... check if the file showed up

获取在file_get_contents中失败,或者写入在file_put_contents失败,或者下载的文件太大,超过了PHP的默认内存限制。

您可能没有启用fopen包装器,因此file_get_contents可能无法工作。尝试使用curl或类似Snoopy的库。

通过验证。。。

验证文件是否首先存在:

function doesUrlExists($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if($code == 200){
        $status = true;
    }else{
        $status = false;
    }
    curl_close($ch);
    return $status;
}

然后放入文件内容(带有laravel存储类):

 if(!doesUrlExists($url_file)) {
     die('The remote file is not accessible. Please check the URL.');
 }
 Storage::disk('local')
          ->put($file_destintation, fopen($url_file, 'r'));

相关内容

  • 没有找到相关文章

最新更新