function doUploadImage($passed_mime = null)
{
    /***
     * Works with the default $_FILES object and handles image
     * uploads.
     *
     * It then creates a thumbnail for easy display.
     *
     * It takes one optional function argument
     *
     * @param passed_mime The mime type of the file (to be passed to client)
     *
     * It has the following optional parameters, that should be
     * provided in the POST / GET request:
     *
     *
     * @param uploadpath the path, relative to this file, to save the
     * uploaded images. Should end in a trailing slash.
     *
     * @param thumb_width the maximum width of a thumbnail. (Aspect
     * ratio will be maintained)
     *
     * @param thumb_height the maximum height of a thumbnail (Aspect
     * ratio will be maintained)
     ***/
    if (empty($_FILES)) {
        return array('status' => false,'error' => 'No files provided','human_error' => 'Please provide a file to upload');
    }
    $temp = $_FILES['file']['tmp_name'];
    $uploadPath = $_REQUEST['uploadpath'];
    $savePath = dirname(__FILE__).'/'.$uploadPath;
    if (!file_exists($savePath)) {
        if(!mkdir($savePath)) {
        return array(
            'status' => false,
            'error' => "Bad path '$savePath'",
            'human_error' => 'There is a server misconfiguration preventing your file from being uploaded',
        );
        }
    }
    $file = $_FILES['file']['name'];
    $exploded = explode('.', $file);
    $extension = array_pop($exploded);
    $fileName = md5($file.microtime_float());
    $newFilePath = $fileName.'.'.$extension;
    $fileWritePath = $savePath.$newFilePath;
    # We want to suppress the warning on move_uploaded_file, or else
    # it'll return an invalid JSON response
    #error_reporting(0); # Disable this for debugging
    // ini_set("error_log","/usr/local/web/amphibian_disease/error-admin.log");
    // ini_set("display_errors",1);
    // ini_set("log_errors",1);
    // error_reporting(E_ALL);
    $status = move_uploaded_file($temp, $fileWritePath);
    $uploadStatus = array('status' => $status,'original_file' => $file,'wrote_file' => $newFilePath,'full_path' => getRelativePath($fileWritePath));
    if (!$status) {
        # We bugged out on completing the upload. Return this status.
        # Formal mime type:
        # https://secure.php.net/manual/en/fileinfo.constants.php
        $finfo = finfo_open(FILEINFO_MIME);
        $mime = finfo_file($finfo, $temp);
        finfo_close($finfo);
        # Return the "real" path for debugging
        $uploadStatus["error"] = "Could not move uploaded file to destination ( Destination directory: ".realpath($savePath).")";
        $uploadStatus["mime"] = "Formal mime: '".$mime."'";
        $uploadStatus["human_error"] = "There was a problem saving your file to the server";
        return $uploadStatus;
    }
    # $uploadStatus["s3"] = copyToS3($fileWritePath, $newFilePath);
    # OK, create the thumbs.
    if (intval($_REQUEST['thumb_width']) > 0) {
        $thumb_max_width = intval($_REQUEST['thumb_width']);
    } else {
        $thumb_max_width = 640;
    }
    if (intval($_REQUEST['thumb_height']) > 0) {
        $thumb_max_height = intval($_REQUEST['thumb_height']);
    } else {
        $thumb_max_height = 480;
    }
    $fileThumb = $savePath.$fileName.'-thumb.'.$extension;
    $resizeStatus = ImageFunctions::staticResizeImage($fileWritePath, $fileThumb, $thumb_max_width, $thumb_max_height);
    # $resizeStatus["s3"] = copyToS3($resizeStatus['output'], $fileName.'-thumb.'.$extension);
    $resizeStatus['output'] = getRelativePath($resizeStatus['output']);
    $uploadStatus['resize_status'] = $resizeStatus;
    $uploadStatus['thumb_path'] = $resizeStatus['output'];
    $uploadStatus["wrote_thumb"] = str_replace("uploaded/","",$resizeStatus["output"]);
    $uploadStatus['mime_provided'] = $passed_mime;
    return $uploadStatus;
}
function saveEntry($get)
{
    /***
     * Save a new taxon entry
     ***/
    $data64 = $get["data"];
    $enc = strtr($data64, '-_', '+/');
    $enc = chunk_split(preg_replace('!\\015\\012|\\015|\\012!', '', $enc));
    $enc = str_replace(' ', '+', $enc);
    $data_string = base64_decode($enc);
    $data = json_decode($data_string, true);
    if (!isset($data["id"])) {
        # The required attribute is missing
        $details = array("original_data" => $data64, "decoded_data" => $data_string, "data_array" => $data);
        return array("status" => false, "error" => "POST data attribute \"id\" is missing", "human_error" => "The request to the server was malformed. Please try again.", "details" => $details);
    }
    # Add the perform key
    global $db;
    $ref = array();
    $ref["id"] = $data["id"];
    unset($data["id"]);
    try {
        $result = $db->updateEntry($data, $ref);
        # Now, we want to do image processing if an image was alerted
        $imgDetails = false;
        if (!empty($data["image"])) {
            $img = $data["image"];
            $imgDetails = array("has_provided_img" => true);
            # Process away!
            $file = dirname(__FILE__) . "/" . $img;
            $imgDetails["file_path"] = $file;
            $imgDetails["relative_path"] = $img;
            if (file_exists($file)) {
                $imgDetails["img_present"] = true;
                # Resize away
                try {
                    $i = new ImageFunctions($file);
                    $thumbArr = explode(".", $img);
                    $extension = array_pop($thumbArr);
                    $outputFile = dirname(__FILE__) . "/" . implode(".", $thumbArr) . "-thumb." . $extension;
                    $imgDetails["resize_status"] = $i->resizeImage($outputFile, 256, 256);
                } catch (Exception $e) {
                    $imgDetails["resize_status"] = false;
                    $imgDetails["resize_error"] = $e->getMessage();
                }
            } else {
                $imgDetails["img_present"] = false;
            }
        }
    } catch (Exception $e) {
        return array("status" => false, "error" => $e->getMessage(), "humman_error" => "Database error saving", "data" => $data, "ref" => $ref, "perform" => "save");
    }
    if ($result !== true) {
        return array("status" => false, "error" => $result, "human_error" => "Database error saving", "data" => $data, "ref" => $ref, "perform" => "save");
    }
    return array("status" => true, "perform" => "save", "data" => $data, "img_details" => $imgDetails);
}