过去两天我一直在寻找所有地方并尝试一切,仍然无法得到任何工作。我觉得这应该是一件相对简单的事情。
我想要做的就是将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!
答案 0 :(得分:15)
这应该这样做:
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.
答案 1 :(得分:14)
$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);
它使用curl
$ url是文件网址
$ path是保存文件的位置和名称
我希望它有效
答案 2 :(得分:5)
使用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
答案 3 :(得分:4)
file_put_contents
需要文件名,而不是目录名。
答案 4 :(得分:2)
自PHP 5.1.0起,file_put_contents()支持通过将stream-handle作为$ data参数传递来逐个编写:
无需使用Curl
file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));
答案 5 :(得分:1)
将其拆分为不同阶段:
$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中的fetch失败,或者file_put_contents中的写入失败,或者您正在下载的文件太大而超出了PHP的默认memory_limit。
答案 6 :(得分:0)
答案 7 :(得分:0)
经过验证...
验证文件是否首先存在:
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'));