Пример #1
0
 public function saveAttachment($name, $offset, $length, $image_mime = null)
 {
     try {
         // do not extract at all
         if ($this->getid3->option_save_attachments === GetID3::ATTACHMENTS_NONE) {
             $attachment = null;
             // do not set any
             // extract to return array
         } elseif ($this->getid3->option_save_attachments === GetID3::ATTACHMENTS_INLINE) {
             $this->fseek($offset);
             $attachment = $this->fread($length);
             // get whole data in one pass, till it is anyway stored in memory
             if ($attachment === false || strlen($attachment) != $length) {
                 throw new \Exception('failed to read attachment data');
             }
             // assume directory path is given
         } else {
             // set up destination path
             $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR);
             if (!is_dir($dir) || !is_writable($dir)) {
                 // check supplied directory
                 throw new \Exception('supplied path (' . $dir . ') does not exist, or is not writable');
             }
             $dest = $dir . DIRECTORY_SEPARATOR . $name . ($image_mime ? '.' . Utils::ImageExtFromMime($image_mime) : '');
             // create dest file
             if (($fp_dest = fopen($dest, 'wb')) == false) {
                 throw new \Exception('failed to create file ' . $dest);
             }
             // copy data
             $this->fseek($offset);
             $buffersize = $this->data_string_flag ? $length : $this->getid3->fread_buffer_size();
             $bytesleft = $length;
             while ($bytesleft > 0) {
                 if (($buffer = $this->fread(min($buffersize, $bytesleft))) === false || ($byteswritten = fwrite($fp_dest, $buffer)) === false || $byteswritten === 0) {
                     throw new \Exception($buffer === false ? 'not enough data to read' : 'failed to write to destination file, may be not enough disk space');
                 }
                 $bytesleft -= $byteswritten;
             }
             fclose($fp_dest);
             $attachment = $dest;
         }
     } catch (\Exception $e) {
         // close and remove dest file if created
         if (isset($fp_dest) && is_resource($fp_dest)) {
             fclose($fp_dest);
             unlink($dest);
         }
         // do not set any is case of error
         $attachment = null;
         $this->warning('Failed to extract attachment ' . $name . ': ' . $e->getMessage());
     }
     // seek to the end of attachment
     $this->fseek($offset + $length);
     return $attachment;
 }