Exemplo n.º 1
0
 /**
  * 
  * 
  */
 public function DownloadRepresentations()
 {
     if ($t_subject = $this->opo_datamodel->getInstanceByTableName($this->ops_tablename, true)) {
         $pa_ids = null;
         if ($vs_ids = trim($this->request->getParameter($t_subject->tableName(), pString))) {
             if ($vs_ids != 'all') {
                 $pa_ids = explode(';', $vs_ids);
                 foreach ($pa_ids as $vn_i => $vs_id) {
                     if (!trim($vs_id) || !(int) $vs_id) {
                         unset($pa_ids[$vn_i]);
                     }
                 }
             }
         }
         if (!is_array($pa_ids) || !sizeof($pa_ids)) {
             $pa_ids = $this->opo_result_context->getResultList();
         }
         $vn_file_count = 0;
         if (is_array($pa_ids) && sizeof($pa_ids)) {
             $ps_version = $this->request->getParameter('version', pString);
             if ($qr_res = $t_subject->makeSearchResult($t_subject->tableName(), $pa_ids, array('filterNonPrimaryRepresentations' => false))) {
                 $o_zip = new ZipFile();
                 if (!($vn_limit = ini_get('max_execution_time'))) {
                     $vn_limit = 30;
                 }
                 set_time_limit($vn_limit * 2);
                 while ($qr_res->nextHit()) {
                     if (!is_array($va_version_list = $qr_res->getMediaVersions('ca_object_representations.media')) || !in_array($ps_version, $va_version_list)) {
                         $vs_version = 'original';
                     } else {
                         $vs_version = $ps_version;
                     }
                     $va_paths = $qr_res->getMediaPaths('ca_object_representations.media', $vs_version);
                     $va_infos = $qr_res->getMediaInfos('ca_object_representations.media');
                     $va_representation_ids = $qr_res->get('ca_object_representations.representation_id', array('returnAsArray' => true));
                     foreach ($va_paths as $vn_i => $vs_path) {
                         $vs_ext = array_pop(explode(".", $vs_path));
                         $vs_idno_proc = preg_replace('![^A-Za-z0-9_\\-]+!', '_', $qr_res->get($t_subject->tableName() . '.idno'));
                         $vs_original_name = $va_infos[$vn_i]['ORIGINAL_FILENAME'];
                         $vn_index = sizeof($va_paths) > 1 ? "_" . ($vn_i + 1) : '';
                         $vn_representation_id = $va_representation_ids[$vn_i];
                         // make sure we don't download representations the user isn't allowed to read
                         if (!caCanRead($this->request->user->getPrimaryKey(), 'ca_object_representations', $vn_representation_id)) {
                             continue;
                         }
                         switch ($this->request->user->getPreference('downloaded_file_naming')) {
                             case 'idno':
                                 $vs_filename = "{$vs_idno_proc}{$vn_index}.{$vs_ext}";
                                 break;
                             case 'idno_and_version':
                                 $vs_filename = "{$vs_idno_proc}_{$vs_version}{$vn_index}.{$vs_ext}";
                                 break;
                             case 'idno_and_rep_id_and_version':
                                 $vs_filename = "{$vs_idno_proc}_representation_{$vn_representation_id}_{$vs_version}{$vn_index}.{$vs_ext}";
                                 break;
                             case 'original_name':
                             default:
                                 if ($vs_original_name) {
                                     $va_tmp = explode('.', $vs_original_name);
                                     if (sizeof($va_tmp) > 1) {
                                         if (strlen($vs_ext = array_pop($va_tmp)) < 3) {
                                             $va_tmp[] = $vs_ext;
                                         }
                                     }
                                     $vs_filename = join('_', $va_tmp) . "{$vn_index}.{$vs_ext}";
                                 } else {
                                     $vs_filename = "{$vs_idno_proc}_representation_{$vn_representation_id}_{$vs_version}{$vn_index}.{$vs_ext}";
                                 }
                                 break;
                         }
                         if ($vs_path_with_embedding = caEmbedMetadataIntoRepresentation(new ca_objects($qr_res->get('ca_objects.object_id')), new ca_object_representations($vn_representation_id), $vs_version)) {
                             $vs_path = $vs_path_with_embedding;
                         }
                         $o_zip->addFile($vs_path, $vs_filename, 0, array('compression' => 0));
                         $vn_file_count++;
                     }
                 }
                 $this->view->setVar('zip', $o_zip);
                 $this->view->setVar('download_name', 'media_for_' . mb_substr(preg_replace('![^A-Za-z0-9]+!u', '_', $this->getCriteriaForDisplay()), 0, 20) . '.zip');
                 set_time_limit($vn_limit);
             }
         }
         if ($vn_file_count > 0) {
             $this->render('Results/object_representation_download_binary.php');
         } else {
             $this->response->setHTTPResponseCode(204, _t('No files to download'));
         }
         return;
     }
     // post error
     $this->postError(3100, _t("Could not generate ZIP file for download"), "BaseEditorController->DownloadRepresentation()");
 }
Exemplo n.º 2
0
 /**
  * Download single representation from currently open object
  */
 public function DownloadRepresentation()
 {
     if (!caObjectsDisplayDownloadLink($this->request)) {
         $this->postError(1100, _t('Cannot download media'), 'DetailController->DownloadMedia');
         return;
     }
     $vn_object_id = $this->request->getParameter('object_id', pInteger);
     $t_object = new ca_objects($vn_object_id);
     $pn_representation_id = $this->request->getParameter('representation_id', pInteger);
     $ps_version = $this->request->getParameter('version', pString);
     $this->view->setVar('representation_id', $pn_representation_id);
     $t_rep = new ca_object_representations($pn_representation_id);
     $this->view->setVar('t_object_representation', $t_rep);
     $va_versions = $t_rep->getMediaVersions('media');
     if (!in_array($ps_version, $va_versions)) {
         $ps_version = $va_versions[0];
     }
     $this->view->setVar('version', $ps_version);
     $va_rep_info = $t_rep->getMediaInfo('media', $ps_version);
     $this->view->setVar('version_info', $va_rep_info);
     $va_info = $t_rep->getMediaInfo('media');
     $vs_idno_proc = preg_replace('![^A-Za-z0-9_\\-]+!', '_', $t_object->get('idno'));
     switch ($this->request->user->getPreference('downloaded_file_naming')) {
         case 'idno':
             $this->view->setVar('version_download_name', $vs_idno_proc . '.' . $va_rep_info['EXTENSION']);
             break;
         case 'idno_and_version':
             $this->view->setVar('version_download_name', $vs_idno_proc . '_' . $ps_version . '.' . $va_rep_info['EXTENSION']);
             break;
         case 'idno_and_rep_id_and_version':
             $this->view->setVar('version_download_name', $vs_idno_proc . '_representation_' . $pn_representation_id . '_' . $ps_version . '.' . $va_rep_info['EXTENSION']);
             break;
         case 'original_name':
         default:
             if ($va_info['ORIGINAL_FILENAME']) {
                 $va_tmp = explode('.', $va_info['ORIGINAL_FILENAME']);
                 if (sizeof($va_tmp) > 1) {
                     if (strlen($vs_ext = array_pop($va_tmp)) < 3) {
                         $va_tmp[] = $vs_ext;
                     }
                 }
                 $this->view->setVar('version_download_name', str_replace(" ", "_", join('_', $va_tmp) . '.' . $va_rep_info['EXTENSION']));
             } else {
                 $this->view->setVar('version_download_name', $vs_idno_proc . '_representation_' . $pn_representation_id . '_' . $ps_version . '.' . $va_rep_info['EXTENSION']);
             }
             break;
     }
     //
     // Perform metadata embedding
     if ($vs_path = caEmbedMetadataIntoRepresentation($t_object, $t_rep, $ps_version)) {
         $this->view->setVar('version_path', $vs_path);
     } else {
         $this->view->setVar('version_path', $t_rep->getMediaPath('media', $ps_version));
     }
     $this->response->sendHeaders();
     $vn_rc = $this->render('Details/object_representation_download_binary.php');
     $this->response->sendContent();
     if ($vs_path) {
         unlink($vs_path);
     }
     return $vn_rc;
 }