Exemple #1
0
 function downloadFile($url, $target = false, &$params = null)
 {
     // this isn't intelligent some times
     $error_object = new stdClass();
     $proxy = false;
     $php_errormsg = '';
     // Set the error message
     $track_errors = ini_set('track_errors', true);
     // Set track errors
     $config =& JFactory::getConfig();
     if (is_null($params)) {
         $params = new JParameter();
     }
     $input_handle = null;
     // Are we on a version of PHP that supports streams?
     if (version_compare(PHP_VERSION, '5.0.0', '>')) {
         // set the ua; we could use ini_set but it might not work
         $http_opts = array('user_agent' => RokUpdater::generateUAString());
         // If:
         // - the proxy is enabled,
         // - the host is set and the port are set
         // Set the proxy settings and create a stream context
         if ($params->get('use_proxy', 0) && strlen($params->get('proxy_host', '')) && strlen($params->get('proxy_port', ''))) {
             $proxy = true;
             // I hate eclipse sometimes
             // If the user has a proxy username set fill this in as well
             $http_opts['proxy'] = 'tcp://' . $params->get('proxy_host') . ':' . $params->get('proxy_port');
             $http_opts['request_fulluri'] = 'true';
             // play nicely with squid
             if (strlen($params->get('proxy_user', ''))) {
                 $credentials = base64_encode($params->get('proxy_user', '') . ':' . $params->get('proxy_pass', ''));
                 $http_opts['header'] = "Proxy-Authorization: Basic {$credentials}\r\n";
             }
         }
         $context = stream_context_create(array('http' => $http_opts));
         $input_handle = @fopen($url, 'r', false, $context);
     } else {
         // Open remote server
         ini_set('user_agent', generateUAString());
         // set the ua
         $input_handle = @fopen($url, "r");
         // or die("Remote server connection failed");
     }
     if (!$input_handle) {
         $error_object->number = 42;
         $error_object->message = 'Remote Server connection failed: ' . $php_errormsg . '; Using Proxy: ' . ($proxy ? 'Yes' : 'No');
         ini_set('track_errors', $track_errors);
         return $error_object;
     }
     $meta_data = stream_get_meta_data($input_handle);
     foreach ($meta_data['wrapper_data'] as $wrapper_data) {
         if (substr($wrapper_data, 0, strlen("Content-Disposition")) == "Content-Disposition") {
             $contentfilename = explode("\"", $wrapper_data);
             $target = $contentfilename[1];
         }
     }
     // Set the target path if not given
     if (!$target) {
         $target = $config->getValue('config.tmp_path') . DS . Downloader::getFilenameFromURL($url);
     } else {
         $target = $config->getValue('config.tmp_path') . DS . basename($target);
     }
     RokUpdater::import('pasamio.pfactory');
     $stream = PFactory::getStream(true, true, 'RokUpdater/' . ROKUPDATER_VERSION, true);
     $relative_target = str_replace(JPATH_ROOT, '', $target);
     $output_handle = $stream->open($relative_target, 'wb');
     //$output_handle = fopen($target, "wb"); // or die("Local output opening failed");
     if (!$output_handle) {
         $error_object->number = 43;
         $error_object->message = 'Local output opening failed: ' . $stream->getError();
         ini_set('track_errors', $track_errors);
         return $error_object;
     }
     $contents = '';
     $downloaded = 0;
     while (!feof($input_handle)) {
         $contents = fread($input_handle, 4096);
         if ($contents === false) {
             $error_object->number = 44;
             $error_object->message = 'Failed reading network resource at ' . $downloaded . ' bytes: ' . $php_errormsg;
             ini_set('track_errors', $track_errors);
             return $error_object;
         } else {
             if (strlen($contents)) {
                 $write_res = $stream->write($contents);
                 if ($write_res == false) {
                     $error_object->number = 45;
                     $error_object->message = 'Cannot write to local target: ' . $stream->getError();
                     ini_set('track_errors', $track_errors);
                     return $error_object;
                 }
                 $downloaded += 1024;
             }
         }
     }
     $stream->close();
     fclose($input_handle);
     ini_set('track_errors', $track_errors);
     return basename($target);
 }
Exemple #2
0
 function downloadFile($url, $target = false, &$params = null)
 {
     if (!function_exists('curl_init')) {
         $error_object = new stdClass();
         $error_object->number = 40;
         $error_object->message = 'cURL support not available on this host. Use fopen instead.';
         return $error_object;
     }
     $config =& JFactory::getConfig();
     if (is_null($params)) {
         $params = new JParameter();
     }
     $php_errormsg = '';
     // Set the error message
     $track_errors = ini_set('track_errors', true);
     // Set track errors
     // create a new cURL resource
     $ch = curl_init();
     // set URL and other appropriate options
     curl_setopt($ch, CURLOPT_URL, $url);
     // Set the download URL
     curl_setopt($ch, CURLOPT_HEADER, false);
     // Don't include the header in the output
     curl_setopt($ch, CURLOPT_USERAGENT, RokUpdater::generateUAString());
     // set the user agent
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
     // follow redirects (required for Joomla!)
     curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
     // 10 maximum redirects
     //		curl_setopt($ch, CURLOPT_HEADERFUNCTION, 					// set a custom header callback
     //				array($this, 'header_callback'));					// use this object and function 'header_callback'
     if (!$target) {
         $target = $config->getValue('config.tmp_path') . DS . Downloader::getFilenameFromURL($url);
     }
     RokUpdater::import('pasamio.pfactory');
     $output_stream = PFactory::getStream(true, true, 'RokUpdater/' . ROKUPDATER_VERSION, true);
     $relative_target = str_replace(JPATH_ROOT, '', $target);
     $output_handle = $output_stream->open($relative_target, 'wb');
     //$output_handle = @fopen($target, "wb"); 								// Open a location
     if (!$output_handle) {
         $error_object->number = 43;
         $error_object->message = 'Local output opening failed: ' . $output_stream->getError();
         ini_set('track_errors', $track_errors);
         return $error_object;
     }
     // since we're using streams we should be able to get everything up and running fine here
     curl_setopt($ch, CURLOPT_FILE, $output_stream->getFileHandle());
     if ($params->get('use_proxy', 0) && strlen($params->get('proxy_host', '')) && strlen($params->get('proxy_port', ''))) {
         curl_setopt($ch, CURLOPT_PROXY, $params->get('proxy_host') . ':' . $params->get('proxy_port'));
         if (strlen($params->get('proxy_user', ''))) {
             curl_setopt($ch, CURLOPT_PROXYUSERPWD, $params->get('proxy_user') . ':' . $params->get('proxy_pass', ''));
         }
     }
     // grab URL and pass it to the browser
     if (curl_exec($ch) === false) {
         $error_object->number = 46;
         $error_object->message = 'cURL transfer failed(' . curl_errno($ch) . '): ' . curl_error($ch);
         ini_set('track_errors', $track_errors);
         return $error_object;
     }
     // close cURL resource, and free up system resources
     curl_close($ch);
     $output_stream->close();
     return basename($target);
 }