• Модуль: imconnector
  • Путь к файлу: ~/bitrix/modules/imconnector/lib/library.php
  • Класс: BitrixImConnectorLibrary
  • Вызов: Library::downloadFile
static function downloadFile(array $file)
{
	if (empty($file['url']))
	{
		$file = false;
	}
	else
	{
		$httpClient = new HttpClient(
			[
				'redirect' => true,
				'disableSslVerification' => true
			]
		);

		$httpClient->setHeader('User-Agent', 'Bitrix Connector Client');

		if (
			!empty($file['headers'])
			&& is_array($file['headers'])
		)
		{
			foreach ($file['headers'] as $header)
			{
				$httpClient->setHeader($header['name'], $header['value']);
			}
		}

		if (self::isEmpty($file['name']))
		{
			$fileName = self::getNameFile($file['url'], true);
		}
		else
		{
			$fileName = $file['name'];
		}

		$tempFilePath = CFile::GetTempName('', $fileName);

		if (
			$httpClient->download($file['url'], $tempFilePath)
			&& $httpClient->getStatus() == '200'
		)
		{
			if (!empty($file['type']))
			{
				$type = $file['type'];
			}
			else
			{
				$type = $httpClient->getHeaders()->get('Content-Type');
			}

			if (self::isEmpty($file['name']) )
			{
				$contentDisposition = $httpClient->getHeaders()->get('Content-Disposition');
				if (!empty($contentDisposition))
				{
					$fileNameContentDisposition = self::getNameFileIsContentDisposition($contentDisposition);
					if (
						!empty($fileNameContentDisposition)
						&& is_string($fileNameContentDisposition)
					)
					{
						$fileName = $fileNameContentDisposition;
					}
				}
				else
				{
					//Correct handling of links with redirect
					$effectiveUrl = $httpClient->getEffectiveUrl();
					if ($effectiveUrl !== $file['url'])
					{
						$fileName = self::getNameFile($effectiveUrl);
					}
				}

				if (MimeType::isImage($type) && !MimeType::isImage(MimeType::getByFilename($fileName)))
				{
					$normalizeType = MimeType::normalize($type);
					foreach (MimeType::getMimeTypeList() as $extension => $checkAgainstMime)
					{
						if ($normalizeType == $checkAgainstMime)
						{
							$fileName .= '.'. $extension;
							break;
						}
					}
				}
			}

			if (
				empty($type)
				|| $type === 'application/octet-stream'
				|| $type === 'binary/octet-stream'
			)
			{
				$fileTemp = new File($tempFilePath);
				$type = $fileTemp->getContentType();
			}

			//The definition of the file extension, it is not specified.
			if (
				mb_strpos($fileName, '.') === false
				&& !empty(self::getMimeTypeList()[$type])
			)
			{
				$fileName .= self::getMimeTypeList()[$type];
			}

			if (empty($type))
			{
				$type = 'application/octet-stream';
			}

			if (self::isEmpty($file['description']))
			{
				$description = '';
			}
			else
			{
				$description = $file['description'];
			}

			$file = [
				'name' => $fileName,
				'tmp_name' => $tempFilePath,
				'type' => $type,
				'description' => $description,
				'MODULE_ID' => self::MODULE_ID
			];
		}
		else
		{
			$file = false;
		}
	}

	return $file;
}