_Note: this function uses the **Range** HTTP header to accomplish downloading in
parts. Not every server supports this header._
The proper use of this function is to call it once per request. The browser
should continue to send requests to Piwik which will in turn call this method
until the file has completely downloaded. In this way, the user can be informed
of a download's progress.
**Example Usage**
browser JavaScript
var downloadFile = function (isStart) {
var ajax = new ajaxHelper();
ajax.addParams({
module: 'MyPlugin',
action: 'myAction',
isStart: isStart ? 1 : 0
}, 'post');
ajax.setCallback(function (response) {
var progress = response.progress
...update progress...
downloadFile(false);
});
ajax.send();
}
downloadFile(true);
PHP controller action
public function myAction()
{
$outputPath = PIWIK_INCLUDE_PATH . '/tmp/averybigfile.zip';
$isStart = Common::getRequestVar('isStart', 1, 'int');
Http::downloadChunk("http://bigfiles.com/averybigfile.zip", $outputPath, $isStart == 1);
}
public static downloadChunk ( string $url, string $outputPath, boolean $isContinuation ) : array | ||
$url | string | The url to download from. |
$outputPath | string | The path to the file to save/append to. |
$isContinuation | boolean | `true` if this is the continuation of a download, or if we're starting a fresh one. |
return | array |
/** * Starts or continues a download for a missing GeoIP database. A database is missing if * it has an update URL configured, but the actual database is not available in the misc * directory. * * Input: * 'url' - The URL to download the database from. * 'continue' - 1 if we're continuing a download, 0 if we're starting one. * * Output: * 'error' - If an error occurs this describes the error. * 'to_download' - The URL of a missing database that should be downloaded next (if any). * 'to_download_label' - The label to use w/ the progress bar that describes what we're * downloading. * 'current_size' - Size of the current file on disk. * 'expected_file_size' - Size of the completely downloaded file. */ public function downloadMissingGeoIpDb() { $this->dieIfGeolocationAdminIsDisabled(); Piwik::checkUserHasSuperUserAccess(); if ($_SERVER["REQUEST_METHOD"] == "POST") { try { $this->checkTokenInUrl(); Json::sendHeaderJSON(); // based on the database type (provided by the 'key' query param) determine the // url & output file name $key = Common::getRequestVar('key', null, 'string'); $url = GeoIPAutoUpdater::getConfiguredUrl($key); $ext = GeoIPAutoUpdater::getGeoIPUrlExtension($url); $filename = GeoIp::$dbNames[$key][0] . '.' . $ext; if (substr($filename, 0, 15) == 'GeoLiteCity.dat') { $filename = 'GeoIPCity.dat' . substr($filename, 15); } $outputPath = GeoIp::getPathForGeoIpDatabase($filename); // download part of the file $result = Http::downloadChunk($url, $outputPath, Common::getRequestVar('continue', true, 'int')); // if the file is done if ($result['current_size'] >= $result['expected_file_size']) { GeoIPAutoUpdater::unzipDownloadedFile($outputPath, $unlink = true); $info = $this->getNextMissingDbUrlInfo(); if ($info !== false) { return json_encode($info); } } return json_encode($result); } catch (Exception $ex) { return json_encode(array('error' => $ex->getMessage())); } } }