/** * Create a file in the upload folder with given content. * * If there is an error, then the key 'error' will exist with the error message. * If success, then the key 'file' will have the unique file path, the 'url' key * will have the link to the new file. and the 'error' key will be set to false. * * This function will not move an uploaded file to the upload folder. It will * create a new file with the content in $bits parameter. If you move the upload * file, read the content of the uploaded file, and then you can give the * filename and content to this function, which will add it to the upload * folder. * * The permissions will be set on the new file automatically by this function. * * @since 0.0.1 * * @param string $name Filename. * @param null|string $deprecated Never used. Set to null. * @param mixed $bits File content * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null. * @return array */ function hq_upload_bits($name, $deprecated, $bits, $time = null) { if (!empty($deprecated)) { _deprecated_argument(__FUNCTION__, '2.0'); } if (empty($name)) { return array('error' => __('Empty filename')); } $hq_filetype = hq_check_filetype($name); if (!$hq_filetype['ext'] && !current_user_can('unfiltered_upload')) { return array('error' => __('Invalid file type')); } $upload = hq_upload_dir($time); if ($upload['error'] !== false) { return $upload; } /** * Filter whether to treat the upload bits as an error. * * Passing a non-array to the filter will effectively short-circuit preparing * the upload bits, returning that value instead. * * @since 0.0.1 * * @param mixed $upload_bits_error An array of upload bits data, or a non-array error to return. */ $upload_bits_error = apply_filters('hq_upload_bits', array('name' => $name, 'bits' => $bits, 'time' => $time)); if (!is_array($upload_bits_error)) { $upload['error'] = $upload_bits_error; return $upload; } $filename = hq_unique_filename($upload['path'], $name); $new_file = $upload['path'] . "/{$filename}"; if (!hq_mkdir_p(dirname($new_file))) { if (0 === strpos($upload['basedir'], ABSPATH)) { $error_path = str_replace(ABSPATH, '', $upload['basedir']) . $upload['subdir']; } else { $error_path = basename($upload['basedir']) . $upload['subdir']; } $message = sprintf(__('Unable to create directory %s. Is its parent directory writable by the server?'), $error_path); return array('error' => $message); } $ifp = @fopen($new_file, 'hq'); if (!$ifp) { return array('error' => sprintf(__('Could not write file %s'), $new_file)); } @fwrite($ifp, $bits); fclose($ifp); clearstatcache(); // Set correct file permissions $stat = @stat(dirname($new_file)); $perms = $stat['mode'] & 07777; $perms = $perms & 0666; @chmod($new_file, $perms); clearstatcache(); // Compute the URL $url = $upload['url'] . "/{$filename}"; return array('file' => $new_file, 'url' => $url, 'error' => false); }
/** * Copy an existing image file. * * @since 0.0.1 * @access private * * @param string $attachment_id Attachment ID. * @return string|false New file path on success, false on failure. */ function _copy_image_file($attachment_id) { $dst_file = $src_file = get_attached_file($attachment_id); if (!file_exists($src_file)) { $src_file = _load_image_to_edit_path($attachment_id); } if ($src_file) { $dst_file = str_replace(basename($dst_file), 'copy-' . basename($dst_file), $dst_file); $dst_file = dirname($dst_file) . '/' . hq_unique_filename(dirname($dst_file), basename($dst_file)); /* * The directory containing the original file may no longer * exist when using a replication plugin. */ hq_mkdir_p(dirname($dst_file)); if (!@copy($src_file, $dst_file)) { $dst_file = false; } } else { $dst_file = false; } return $dst_file; }