public function downloadAction() { if ($this->_getParam('obj')) { $response = $this->getResponse(); $etag = md5($this->_getParam('obj')); if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { $this->_sendResponse(304); } $media = new MediaObject(base64_decode($this->_getParam('obj'))); if (!$media->mime) { $this->_sendResponse(404); } $response->setHeader('Content-Type', $media->mime); $response->setHeader('Content-Disposition', sprintf('attachment; filename="%s"', $media->label)); $response->setHeader('ETag', $etag); if (Core::$env == Core::ENV_PROD) { $response->setHeader('Expires', gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 30 * 86400)); } $response->setBody($media->loadBlob('media')); $this->_sendResponse(); } else { $this->_sendResponse(404); } }
/** * Populates a data object from a key/value array * * @param array $data * @param \t41\Backend\Mapper $mapper * @return \t41\ObjectModel\DataObject */ public function populate(array $data, Backend\Mapper $mapper = null) { if ($mapper) { // @todo fix compatibility with metakeys in array $data = $mapper->toDataObject($data, $this->_class); } // then sent to data object properties foreach ($data as $key => $value) { // don't use empty() to check $value to avoid zero being ignored if (($property = $this->getProperty($key)) !== false && !is_null($value)) { if ($value == Property::EMPTY_VALUE) { $property->resetValue(); continue; } if ($property instanceof ObjectProperty || $property instanceof MediaProperty) { if ($property->getParameter('instanceof') == null) { throw new DataObject\Exception("Parameter 'instanceof' for '{$key}' in class should contain a class name"); } // Specific case of MediaObject() if ($property->getParameter('instanceof') == 't41\\ObjectModel\\MediaObject') { // new file case : value is a string prepended by 'tmp:' if ($value && substr($value, 0, strlen(MediaObject::TMP_PREFIX)) == MediaObject::TMP_PREFIX) { $parts = explode('|', substr($value, 4)); // 0 => hash, 1 => original file name $file = '/tmp/' . $parts[0]; if (file_exists($file)) { $media = new MediaObject(); $media->setUri(md5(rand() * microtime())); $media->setLabel($parts[1]); $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $file); $media->setMedia($file); // blob property $media->setSize(filesize($file)); $media->setMime($mime); $media->save(); $property->setValue($media); // media property unlink($file); } continue; // don't go further in this case } } if ($value && $value != Property::EMPTY_VALUE) { if (is_object($value) && get_class($value) == $property->getParameter('instanceof')) { $property->setValue($value); } else { if (substr($value, 0, 4) == 'obj_') { // get object from cache $property->setValue(Core::cacheGet($value)); } else { if (substr($value, 0, 1) == Backend::PREFIX) { /* get & call object's backend to get a full configured object uri */ $backend = ObjectModel::getObjectBackend($property->getParameter('instanceof')); $value = $backend->buildObjectUri($value, $property->getParameter('instanceof')); $property->setValue($value instanceof ObjectUri ? $value : new ObjectUri($value)); } else { //$class = $property->getParameter('instanceof'); $backend = ObjectModel::getObjectBackend($property->getParameter('instanceof')); $value = $backend->buildObjectUri($value, $property->getParameter('instanceof')); $property->setValue($value); } } } } else { $property->resetValue(); } } else { if ($property instanceof Property\CollectionProperty) { // @todo handle collection populating here } else { // if value is an array, it is most likely a set of multiple options if (is_array($value)) { $value = implode('|', $value); } $property->setValue($value); } } } } return $this; }