// Note: (at this point in execution)
 // If the entity contains binary fields, their values have been initialized from the $_POST array; and not the $_FILES array
 // Even if an existing entity was loaded with a binary value, that value could have been overriden with a value from $_POST
 // Validate
 $errs = EntityValidator::validate($entity);
 // Process file uploads for binary types
 foreach ($entityBP->fields() as $field) {
     if ($field->getDataType() == "binary") {
         $key = $field->getKey();
         Log::debug("Processing file upload for: {$key}");
         /*
         // Check for file upload
         */
         // construct file name
         $entityKey = substr($entitySignature, 0, strpos($entitySignature, "."));
         $fileExtension = Binary::extension($field->getMimeType());
         $filename = $entityKey . "." . $key . "." . $entityId . "." . $fileExtension;
         // determine destination for temporary file
         $path_upload_today = BPConfig::$path_upload . date("Y-m-d") . "/";
         $path_upload_user = $path_upload_today . $session_id . "/";
         $file_upload = $path_upload_user . $filename;
         Log::debug("Checking for file <{$file_upload}>");
         if (is_readable($file_upload)) {
             // NOTE: file was validated by /conduit/upload.php
             $size = filesize($file_upload);
             Log::debug("...Found file ({$size})");
             $entity->set($key, file_get_contents($file_upload));
             $entity->length($key, $size);
             if (count($errs) == 0) {
                 // clean up temporary files
                 @unlink($file_upload);
 public static function export(Blueprint $blueprint, $type = "tar", $where = NULL, array $filters = NULL)
 {
     // NOTE: type=(tar, csv)
     $tag = "EntityExporter::export()";
     Log::notice("{$tag}");
     // create export path
     $path_tmp = BPConfig::$path_tmp;
     $path_unique = $path_tmp . uniqid("bp") . "/";
     $path_export = $path_unique . $blueprint->signature() . "/";
     Log::debug("{$tag}: path_export = {$path_export}");
     $fields = $blueprint->fields();
     // get data to export
     try {
         $results = EntityExporter::prepareData($blueprint, $where, $filters);
     } catch (Exception $e) {
         throw $e;
     }
     // create tmp directory for tar files
     if ($type == "tar") {
         if (is_writable($path_tmp)) {
             if (!mkdir($path_export, 0777, true)) {
                 throw new Exception("{$tag}: Failed to mkdir: {$path_export}");
             }
         } else {
             throw new Exception("{$tag}: Cannot write to " . $path_tmp);
         }
     }
     // start output buffer
     $csv = "";
     $csv .= "id,";
     // add header row
     foreach ($fields as $f) {
         $displayAs = $f->getKey();
         $csv .= "{$displayAs},";
         if ($f->isForeignKey()) {
             // Add column header for foreign value
             $csv .= $f->getForeignValue() . ",";
         }
     }
     $csv = substr($csv, 0, strlen($csv) - 1);
     // remove trailing comma ","
     $csv .= "\n";
     // add result rows
     for ($i = 0; $i < $results->get_num_rows(); $i++) {
         $row = $results->get_next_row();
         $csv .= $row->id . ",";
         foreach ($fields as $f) {
             $key = $f->getKey();
             // retrieve value
             if ($f->isForeignKey()) {
                 // Insert local value before foreign value
                 $value = $row->{$key};
                 $csv .= "{$value},";
                 // Retrieve foreign value and continue with formatting below...
                 $foreignValue = str_replace(".", "_", $f->getForeignValue());
                 $value = $row->{$foreignValue};
             } else {
                 $value = $row->{$key};
             }
             // format values
             if (!empty($value) || $value == 0) {
                 // format values based on dataType
                 switch ($f->getDataType()) {
                     case "int":
                         if ($f->isForeignKey()) {
                             $value = "\"{$value}\"";
                         }
                         break;
                     case "string":
                         // encrypted values
                         if ($f->getEncType() == "md5" || $f->getEncType() == "sha1") {
                             $value = "******";
                         } else {
                             $value = addslashes($value);
                             $value = "\"{$value}\"";
                         }
                         break;
                     case "text":
                         $value = "\"{$value}\"";
                         break;
                     case "binary":
                         // generate filename
                         $filename_bin = $blueprint->getKey() . "." . $key . "." . $row->id . "." . Binary::extension($f->getMimeType());
                         // write binary data to file
                         if ($type == "tar") {
                             $path_bin = $path_export . $filename_bin;
                             Log::debug("{$tag}: Creating binary file: {$path_bin}");
                             if (!file_put_contents($path_bin, $value)) {
                                 Log::warning("{$tag}: Failed to create binary file: {$path_bin}");
                             }
                         }
                         // replace raw data with filename
                         $value = $filename_bin;
                         break;
                     default:
                         $value = addslashes($value);
                 }
                 // TODO: format values based on ListBlueprint formatter
             }
             // END: if( (!empty($value)) || ($value==0) )
             $csv .= "{$value},";
         }
         $csv = substr($csv, 0, strlen($csv) - 1);
         // remove trailing comma ","
         $csv .= "\n";
     }
     // create tar
     if ($type == "tar") {
         // create blueprint xml file in export path
         $path_blueprint = $path_export . $blueprint->signature();
         $xmlStr = $blueprint->asXml();
         file_put_contents($path_blueprint, $xmlStr);
         // create csv file in export path
         $path_csv = $path_export . $blueprint->getKey() . ".csv";
         file_put_contents($path_csv, $csv);
         $path_tar = $path_unique . $blueprint->getKey() . ".tar";
         $cmd = "tar --create --directory={$path_unique} --file={$path_tar} --gzip " . $blueprint->signature();
         Log::debug("{$tag}: Executing: {$cmd}");
         exec($cmd);
         // retrieve contents of tar file
         $tar = file_get_contents($path_tar);
         // cleanup
         $glob = glob($path_export . "*");
         foreach ($glob as $path_clean) {
             if (!unlink($path_clean)) {
                 Log::warning("{$tag}: Failed to unlink: {$path_clean}");
             }
         }
         if (!rmdir($path_export)) {
             Log::warning("{$tag}: Failed to rmdir: {$path_export}");
         }
         if (!unlink($path_tar)) {
             Log::warning("{$tag}: Failed to unlink: {$path_tar}");
         }
         if (!rmdir($path_unique)) {
             Log::warning("{$tag}: Failed to rmdir: {$path_unique}");
         }
         return $tar;
     } else {
         if ($type == "csv") {
             return $csv;
         }
     }
 }
        $bp = BlueprintReader::read($blueprint_file_name);
        // lookup the field
        $f = $bp->get($field);
        // retrieve meta data for file creation
        $mimeType = $f->getMimeType();
        // retrieve the binary as a string
        $binaryString = Binary::getString($blueprint, $field, $id);
    } catch (Exception $e) {
        Log::error($e->getMessage());
        echo "EXCEPTION: " . $e->getMessage();
        exit;
    }
    switch ($action) {
        case "file":
            // create filename
            $ext = Binary::extension($mimeType);
            $filename = $blueprint . "." . $field . "." . $id . "." . $ext;
            // set headers
            header("Content-Type: {$mimeType}");
            header("Content-Disposition: attachment; filename={$filename}");
            header("Content-Transfer-Encoding: binary");
            echo "{$binaryString}";
            break;
        case "stream":
            // set headers
            header("Content-Type: {$mimeType}");
            echo "{$binaryString}";
            break;
    }
}
Log::debug("END: /blueprints/binary.php" . "\n");