haku Posted January 25, 2008 Share Posted January 25, 2008 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 More sharing options...
haku Posted January 26, 2008 Author Share Posted January 26, 2008 bump Link to comment https://forums.phpfreaks.com/topic/87693-headers-and-encoding/#findComment-449427 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.