Jump to content

headers and encoding


haku

Recommended Posts

I am forcing files on my server to be downloaded rather than opened in the browser using the following function:

 

	function output_file($file, $name, $mime_type='')
{
	/*
	This function takes a path to a file to output ($file), 
	the filename that the browser will see ($name) and 
	the MIME type of the file ($mime_type, optional).

	If you want to do something on download abort/finish,
	register_shutdown_function('function_name');
	*/
	if(!is_readable($file))
	{
		die('File not found or inaccessible!');
	}

	$size = filesize($file);
	$name = rawurldecode($name);

	/* Figure out the MIME type (if not specified) */
	$known_mime_types=array(
		"pdf" => "application/pdf",
	 	"txt" => "text/plain",
	 	"html" => "text/html",
	 	"htm" => "text/html",
		"exe" => "application/octet-stream",
		"zip" => "application/zip",
		"doc" => "application/msword",
		"xls" => "application/vnd.ms-excel",
		"ppt" => "application/vnd.ms-powerpoint",
		"gif" => "image/gif",
		"png" => "image/png",
		"jpeg"=> "image/jpg",
		"jpg" =>  "image/jpg",
		"php" => "text/plain",
		"ppt" => "application/vnd.ms-powerpoint"
	);

	if($mime_type=='')
	{
		$file_extension = strtolower(substr(strrchr($file,"."),1));
		if(array_key_exists($file_extension, $known_mime_types))
		{
			$mime_type=$known_mime_types[$file_extension];
		}
		else
		{
			$mime_type="application/force-download";
		}
	}

	@ob_end_clean(); //turn off output buffering to decrease cpu usage

	// required for IE, otherwise Content-Disposition may be ignored
	if(ini_get('zlib.output_compression'))
	{
		ini_set('zlib.output_compression', 'Off');
	}

	header('Content-Type: ' . $mime_type);
	header('Content-Disposition: attachment; filename="'.$name.'"');
	header("Content-Transfer-Encoding: binary");
	header('Accept-Ranges: bytes');


	/* The three lines below basically make the 
 	    download non-cacheable */
	header("Cache-control: private");
	header('Pragma: private');
	header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

	// multipart-download and download resuming support
	if(isset($_SERVER['HTTP_RANGE']))
	{
		list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
		list($range) = explode(",",$range,2);
		list($range, $range_end) = explode("-", $range);
		$range=intval($range);
		if(!$range_end)
		{
			$range_end=$size-1;
		}
		else
		{
			$range_end=intval($range_end);
		}

		$new_length = $range_end-$range+1;
		header("HTTP/1.1 206 Partial Content");
		header("Content-Length: $new_length");
		header("Content-Range: bytes $range-$range_end/$size");
 	}
 	else
 	{
		$new_length=$size;
		header("Content-Length: ".$size);
 	}

	/* output the file itself */
	$chunksize = 1*(1024*1024); //you may want to change this
	$bytes_send = 0;
	if ($file = fopen($file, 'r'))
	{
		if(isset($_SERVER['HTTP_RANGE']))
		fseek($file, $range);

		while(!feof($file) && (!connection_aborted()) && ($bytes_send<$new_length))
		{
			$buffer = fread($file, $chunksize);
			print($buffer); //echo($buffer); // is also possible
			flush();
			$bytes_send += strlen($buffer);
		}
 		fclose($file);
 		}
 	else
 	{
 		die('Error - can not open file.');
 	}

	die();
}

 

My problem is that the name of the file (called with '$name' when calling the function) is in Japanese. No matter what I do, the name comes out as gibberish. i have tried setting the accept encoding using the following header:

 

header('Accept-Charset: Shift_JIS')

 

as well as this:

 

header('Content-Type: ' . $mime_type '; charset=Shift_JIS');

 

and a combination of both. I have also tried ISO-2022-JP and EUC-JP (the other two types of Japanese encoding), but none of them seem to work. Does anybody know what the header I need to set is in order for the file name to come out in proper Japanese and not be garbled? Thank you for your time.

Link to comment
https://forums.phpfreaks.com/topic/87693-headers-and-encoding/
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.