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 ? '.' . getid3_lib::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; }