php/* **********************************************************************
Class: Mht File Maker
Version: 1.2 beta
Date: 02/11/2007
Author: Wudi
Description: The class can make .mht file.
********************************************************************** */ class MhtFileMaker{ var $config = array (); var $headers = array (); var $headers_exists = array (); var $files = array (); var $boundary ; var $dir_base ; var $page_first ; function MhtFile( $config = array ()){
} function SetHeader( $header ){ $this -> headers[] = $header ; $key = strtolower ( substr ( $header , 0 , strpos ( $header , ' : ' ))); $this -> headers_exists[ $key ] = TRUE ;
} function SetFrom( $from ){ $this -> SetHeader( " From: $from " );
} function SetSubject( $subject ){ $this -> SetHeader( " Subject: $subject " );
} function SetDate( $date = NULL , $istimestamp = FALSE ){ if ( $date == NULL ) { $date = time ();
} if ( $istimestamp == TRUE ) { $date = date ( ' D, d M Y H:i:s O ' , $date );
} $this -> SetHeader( " Date: $date " );
} function SetBoundary( $boundary = NULL ){ if ( $boundary == NULL ) { $this -> boundary = ' -- ' . strtoupper ( md5 ( mt_rand ())) . ' _MULTIPART_MIXED ' ;
} else { $this -> boundary = $boundary ;
}
} function SetBaseDir( $dir ){ $this -> dir_base = str_replace ( " \\ " , " / " , realpath ( $dir ));
} function SetFirstPage( $filename ){ $this -> page_first = str_replace ( " \\ " , " / " , realpath ( " {$this->dir_base}/$filename " ));
} function AutoAddFiles(){ if ( ! isset ( $this -> page_first)) { exit ( ' Not set the first page. ' );
} $filepath = str_replace ( $this -> dir_base , '' , $this -> page_first); $filepath = ' http://mhtfile ' . $filepath ; $this -> AddFile( $this -> page_first , $filepath , NULL ); $this -> AddDir( $this -> dir_base);
} function AddDir( $dir ){ $handle_dir = opendir ( $dir ); while ( $filename = readdir ( $handle_dir )) { if (( $filename != ' . ' ) && ( $filename != ' .. ' ) && ( " $dir/$filename " != $this -> page_first)) { if ( is_dir ( " $dir/$filename " )) { $this -> AddDir( " $dir/$filename " );
} elseif ( is_file ( " $dir/$filename " )) { $filepath = str_replace ( $this -> dir_base , '' , " $dir/$filename " ); $filepath = ' http://mhtfile ' . $filepath ; $this -> AddFile( " $dir/$filename " , $filepath , NULL );
}
}
} closedir ( $handle_dir );
} function AddFile( $filename , $filepath = NULL , $encoding = NULL ){ if ( $filepath == NULL ) { $filepath = $filename ;
} $mimetype = $this -> GetMimeType( $filename ); $filecont = file_get_contents ( $filename ); $this -> AddContents( $filepath , $mimetype , $filecont , $encoding );
} function AddContents( $filepath , $mimetype , $filecont , $encoding = NULL ){ if ( $encoding == NULL ) { $filecont = chunk_split ( base64_encode ( $filecont ) , 76 ); $encoding = ' base64 ' ;
} $this -> files[] = array ( ' filepath ' => $filepath , ' mimetype ' => $mimetype , ' filecont ' => $filecont , ' encoding ' => $encoding );
} function CheckHeaders(){ if ( ! array_key_exists ( ' date ' , $this -> headers_exists)) { $this -> SetDate( NULL , TRUE );
} if ( $this -> boundary == NULL ) { $this -> SetBoundary();
}
} function CheckFiles(){ if ( count ( $this -> files) == 0 ) { return FALSE ;
} else { return TRUE ;
}
} function GetFile(){ $this -> CheckHeaders(); if ( ! $this -> CheckFiles()) { exit ( ' No file was added. ' );
} $contents = implode ( " \r\n " , $this -> headers); $contents .= " \r\n " ; $contents .= " MIME-Version: 1.0\r\n " ; $contents .= " Content-Type: multipart/related;\r\n " ; $contents .= " \tboundary=\ " { $this -> boundary}\ " ;\r\n " ; $contents .= " \ttype=\ "" . $this->files[0]['mimetype'] . " \ " \r\n " ; $contents .= " X-MimeOLE: Produced By Mht File Maker v1.0 beta\r\n " ; $contents .= " \r\n " ; $contents .= " This is a multi-part message in MIME format.\r\n " ; $contents .= " \r\n " ; foreach ( $this -> files as $file ) { $contents .= " --{$this->boundary}\r\n " ; $contents .= " Content-Type: $file[mimetype]\r\n " ; $contents .= " Content-Transfer-Encoding: $file[encoding]\r\n " ; $contents .= " Content-Location: $file[filepath]\r\n " ; $contents .= " \r\n " ; $contents .= $file [ ' filecont ' ]; $contents .= " \r\n " ;
} $contents .= " --{$this->boundary}--\r\n " ; return $contents ;
} function MakeFile( $filename ){ $contents = $this -> GetFile(); $fp = fopen ( $filename , ' w ' ); fwrite ( $fp , $contents ); fclose ( $fp );
} function GetMimeType( $filename ){ $pathinfo = pathinfo ( $filename ); switch ( $pathinfo [ ' extension ' ]) { case ' htm ' : $mimetype = ' text/html ' ; break ; case ' html ' : $mimetype = ' text/html ' ; break ; case ' txt ' : $mimetype = ' text/plain ' ; break ; case ' cgi ' : $mimetype = ' text/plain ' ; break ; case ' php ' : $mimetype = ' text/plain ' ; break ; case ' css ' : $mimetype = ' text/css ' ; break ; case ' jpg ' : $mimetype = ' image/jpeg ' ; break ; case ' jpeg ' : $mimetype = ' image/jpeg ' ; break ; case ' jpe ' : $mimetype = ' image/jpeg ' ; break ; case ' gif ' : $mimetype = ' image/gif ' ; break ; case ' png ' : $mimetype = ' image/png ' ; break ; default : $mimetype = ' application/octet-stream ' ; break ;
} return $mimetype ;
}
}?>