function get_mime($fn) { if (function_exists('finfo_file')) { $finfo = @finfo_open(FILEINFO_MIME_TYPE); $mime = @finfo_file($finfo, $fn); @finfo_close($finfo); } $mime = false; if (!@is_string($mime)) { // heuristic switch (strtolower(filext($fn))) { case 'aif': case 'aiff': $mime = 'audio/aiff'; break; case 'avi': $mime = 'video/x-msvideo'; break; case 'bmp': $mime = 'image/bmp'; break; case 'gif': $mime = 'image/gif'; break; case 'jpg': case 'jpeg': $mime = 'image/jpeg'; break; case 'mov': $mime = 'video/quicktime'; break; case 'mp3': $mime = 'audio/mpeg3'; break; case 'mp4': $mime = 'video/mp4'; break; case 'mpg': case 'mpeg': $mime = 'video/mpeg'; break; case 'oga': case 'ogg': $mime = 'audio/ogg'; break; case 'ogv': $mime = 'video/ogg'; break; case 'pdf': $mime = 'application/pdf'; break; case 'png': $mime = 'image/png'; break; case 'tga': $mime = 'image/tga'; break; case 'tif': case 'tiff': $mime = 'image/tiff'; break; case 'txt': $mime = 'text/plain'; break; case 'wav': $mime = 'audio/wav'; break; case 'webm': $mime = 'video/webm'; break; case 'zip': $mime = 'application/zip'; break; default: $mime = ''; } } return $mime; }
function page_upload($args) { // only handle the file if the frontend wants us to if (empty($args['preferred_module']) || $args['preferred_module'] != 'page') { return false; } // check if supported file if (!in_array($args['mime'], array('image/jpeg', 'image/png', 'image/gif')) || $args['mime'] == '' && !in_array(filext($args['file']), array('jpg', 'jpeg', 'png', 'gif'))) { return false; } // check if there is already a background-image and delete it $obj = load_object(array('name' => $args['page'] . '.page')); if (!$obj['#error']) { $obj = $obj['#data']; if (!empty($obj['page-background-file'])) { delete_upload(array('pagename' => array_shift(expl('.', $args['page'])), 'file' => $obj['page-background-file'], 'max_cnt' => 1)); } } // set as background-image in page object $obj = array(); $obj['name'] = $args['page'] . '.page'; $obj['page-background-file'] = $args['file']; $obj['page-background-mime'] = $args['mime']; // update page object load_modules('glue'); $ret = update_object($obj); if ($ret['#error']) { log_msg('page_upload: error updating page object: ' . quot($ret['#data'])); return false; } else { // we don't actually render the object here, but signal the // frontend that everything went okay return true; } }
/** * implements upload */ function image_upload($args) { // check if supported file if (!in_array($args['mime'], array('image/jpeg', 'image/png', 'image/gif')) || $args['mime'] == '' && !in_array(filext($args['file']), array('jpg', 'jpeg', 'png', 'gif'))) { return false; } load_modules('glue'); // create new object $obj = create_object($args); if ($obj['#error']) { return false; } else { $obj = $obj['#data']; } $obj['type'] = 'image'; // this is for a potential future speedup $obj['module'] = 'image'; $obj['image-file'] = $args['file']; $obj['image-file-mime'] = $args['mime']; // save original-{width,height} if we can calculate it if (_gd_available()) { $a = expl('.', $args['page']); $size = _gd_get_imagesize(CONTENT_DIR . '/' . $a[0] . '/shared/' . $obj['image-file']); $obj['image-file-width'] = $size[0]; $obj['object-width'] = $size[0] . 'px'; $obj['image-file-height'] = $size[1]; $obj['object-height'] = $size[1] . 'px'; } save_object($obj); // render object and return html $ret = render_object(array('name' => $obj['name'], 'edit' => true)); log_msg('debug', 'image_upload: ' . print_r($ret, 1)); if ($ret['#error']) { return false; } else { return $ret['#data']; } }
function video_upload($args) { $ext = filext($args['file']); if ($args['mime'] == 'video/ogg' || $ext == 'ogv' || $ext == 'ogg') { // notice: we also handle ogg here although this also could be a // different mime type // make sure mime type is set $mime = 'video/ogg'; } elseif ($args['mime'] == 'video/h264' || $ext == 'h264') { // haven't seen these out there $mime = 'video/h264'; } elseif ($args['mime'] == 'video/mp4' || $ext == 'mp4') { // think this need not be h264, but well $mime = 'video/mp4'; } elseif ($args['mime'] == 'video/webm' || $ext == 'webm') { // again, webm could also be audio/webm $mime = 'video/webm'; } else { return false; } load_modules('glue'); $obj = create_object($args); if ($obj['#error']) { return false; } else { $obj = $obj['#data']; } $obj['type'] = 'video'; $obj['module'] = 'video'; $obj['video-file'] = $args['file']; $obj['video-file-mime'] = $mime; save_object($obj); $ret = render_object(array('name' => $obj['name'], 'edit' => true)); if ($ret['#error']) { return false; } else { return $ret['#data']; } }
function inject_uploaded_file($tmp_key, $file, $auto_convert = true) { // establish destination filename $dest_fn = get_uploaded_file_dest_fn($tmp_key, $file['name'], $file['type'], $file['tmp_name']); if ($dest_fn === false) { return array(); } // make sure the containing directories exist create_containing_dir(tmp_dir($tmp_key) . '/' . $dest_fn); // move to destination if (false === @move_uploaded_file($file['tmp_name'], tmp_dir($tmp_key) . '/' . $dest_fn)) { return array(); } if ($auto_convert) { // convert Word documents instantaneously to Markdown $start = time(); if (filext($dest_fn) === 'docx') { make_run(tmp_dir($tmp_key), 'markdowns'); // XXX (later): run "make clean" here? } $modified_after = repo_get_modified_files_after($tmp_key, $start - 1); // make sure the destination filename is part of th array if (is_array($modified_after) && !in_array($dest_fn, $modified_after)) { $modified_after[] = $dest_fn; } return $modified_after; } return array($dest_fn); }