LINUX.ORG.RU

PHP readfile!

 


0

1

Есть функция (написана не мной), отдающая торрент-файл юзеру при помощи стандартной функции readfile. Мне нужно что бы отдаваемый файл юзеру, перед тем как пардон отдаться, записывался на сервере в условный test.html Попытался написать так (обратите внимание на то, что мечено комментарием /*ПОПЫТКА ЗАПИСАТЬ ФАЙЛ * перед отдачей юзеру*/), но не выходит, файл юзеру отдается, а на сервере файл test.html пуст (права перепроверял, если писать туда строку то все работает):

// Send file to browser
function send_file_to_browser($attachment, $upload_dir)
{
	global $lang, $attach_config;

	$filename = ($upload_dir == '') ? $attachment['physical_filename'] : $upload_dir . '/' . $attachment['physical_filename'];

	$gotit = false;

	if (!intval($attach_config['allow_ftp_upload']))
	{
		if (@!file_exists(@amod_realpath($filename)))
		{
			message_die(GENERAL_ERROR, $lang['ERROR_NO_ATTACHMENT'] . "<br /><br />" . $filename.  "<br /><br />" .$lang['TOR_NOT_FOUND']);
		}
		else
		{
			$gotit = true;
		}
	}

	//
	// Determine the Browser the User is using, because of some nasty incompatibilities.
	// Most of the methods used in this function are from phpMyAdmin. :)
	//
	if (!empty($_SERVER['HTTP_USER_AGENT']))
	{
		$HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
	}
	else if (!isset($HTTP_USER_AGENT))
	{
		$HTTP_USER_AGENT = '';
	}

	if (preg_match('/Opera(\/| )([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version))
	{
		$browser_version = $log_version[2];
		$browser_agent = 'opera';
	}
	else if (preg_match('/MSIE ([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version))
	{
		$browser_version = $log_version[1];
		$browser_agent = 'ie';
	}
	else if (preg_match('/OmniWeb\/([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version))
	{
		$browser_version = $log_version[1];
		$browser_agent = 'omniweb';
	}
	else if (preg_match('/Netscape([0-9]{1})/', $HTTP_USER_AGENT, $log_version))
	{
		$browser_version = $log_version[1];
		$browser_agent = 'netscape';
	}
	else if (preg_match('/Mozilla\/([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version))
	{
		$browser_version = $log_version[1];
		$browser_agent = 'mozilla';
	}
	else if (preg_match('/Konqueror\/([0-9].[0-9]{1,2})/', $HTTP_USER_AGENT, $log_version))
	{
		$browser_version = $log_version[1];
		$browser_agent = 'konqueror';
	}
	else
	{
		$browser_version = 0;
		$browser_agent = 'other';
	}

	// Correct the mime type - we force application/octetstream for all files, except images
	// Please do not change this, it is a security precaution
	if (!strstr($attachment['mimetype'], 'image'))
	{
		$attachment['mimetype'] = ($browser_agent == 'ie' || $browser_agent == 'opera') ? 'application/octetstream' : 'application/octet-stream';
	}

	//bt
	global $userdata;

	if (!(isset($_GET['original']) && !IS_USER))
	{
		include(INC_DIR .'functions_torrent.php');
		send_torrent_with_passkey($filename);
	}
	//bt end

	// Now the tricky part... let's dance
//	@ob_end_clean();
//	@ini_set('zlib.output_compression', 'Off');
	header('Pragma: public');
//	header('Content-Transfer-Encoding: none');

//$real_filename = html_entity_decode(basename($attachment['real_filename']));
	$real_filename = clean_filename(basename($attachment['real_filename']));
	$mimetype = "{$attachment['mimetype']};";
	$charset = (@$lang['CONTENT_ENCODING']) ? "charset={$lang['CONTENT_ENCODING']};" : '';

	// Send out the Headers
	header("Content-Type: $mimetype $charset name=\"$real_filename\"");
	header("Content-Disposition: inline; filename=\"$real_filename\"");	

	unset($real_filename);
	//
	// Now send the File Contents to the Browser
	//
	if ($gotit)
	{
		$size = @filesize($filename);
		if ($size)
		{
			header("Content-length: $size");
		}
		
		/*ПОПЫТКА ЗАПИСАТЬ ФАЙЛ
		 * перед отдачей юзеру*/
		file_put_contents('test.html', $filename, FILE_APPEND | LOCK_EX);
		
		readfile($filename);
	}
	else if (!$gotit && intval($attach_config['allow_ftp_upload']))
	{
		$conn_id = attach_init_ftp();		

		$ini_val = ( @phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var';

		$tmp_path = ( !@$ini_val('safe_mode') ) ? '/tmp' : $upload_dir;
		$tmp_filename = @tempnam($tmp_path, 't0000');

		@unlink($tmp_filename);

		$mode = FTP_BINARY;
		if ( (preg_match("/text/i", $attachment['mimetype'])) || (preg_match("/html/i", $attachment['mimetype'])) )
		{
			$mode = FTP_ASCII;
		}

		$result = @ftp_get($conn_id, $tmp_filename, $filename, $mode);

		if (!$result)
		{
			message_die(GENERAL_ERROR, $lang['ERROR_NO_ATTACHMENT'] . "<br /><br />" . $filename.  "<br /><br />" .$lang['TOR_NOT_FOUND']);
		}		

		@ftp_quit($conn_id);

		$size = @filesize($tmp_filename);
		if ($size)
		{
			header("Content-length: $size");
		}
		
		/*ПОПЫТКА ЗАПИСАТЬ ФАЙЛ
		 * перед отдачей юзеру*/
		file_put_contents('test.html', $tmp_filename, FILE_APPEND | LOCK_EX);
		
		readfile($tmp_filename);		
		@unlink($tmp_filename);
	}
	else
	{
		message_die(GENERAL_ERROR, $lang['ERROR_NO_ATTACHMENT'] . "<br /><br />" . $filename.  "<br /><br />" .$lang['TOR_NOT_FOUND']);
	}

	exit;
}


Как решить проблему?



Последнее исправление: makeB (всего исправлений: 1)

file_put_contents('test.html', $tmp_filename, FILE_APPEND | LOCK_EX);

Почему не file_put_contents('test.html', file_get_contents( $tmp_filename), FILE_APPEND | LOCK_EX);

А сейчас ты выводишь в test.html имя временного файла (хотя я и не понимаю, почему оно не выводится)

amomymous ★★★
()

После file_put_contents:

ptint_r (error_get_last ());
metrokto ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.