Загрузка изображений с пользовательской страницы с помощью загрузчика blueimp?


Я работаю с формой загрузки интерфейса, которая использует загрузчик jQuery-файлов blueimp для выполнения всей тяжелой работы... но, после попытки добавить необходимую функциональность WordPress в blueimp, я начал сталкиваться с некоторыми ошибками, которые я не могу понять.

Обновление / Мой код

HTML (форма интерфейса):

<form id="fileupload" action="" method="POST" enctype="multipart/form-data">

    <span class="btn btn-success fileinput-button">
        <span>Add files...</span>
        <!-- The file input field used as target for the file upload widget -->
        <input type="file" name="files[]" multiple />
    </span>

    <div id="progress" class="progress">
        <div class="progress-bar progress-bar-success"></div>
    </div>
</form>

JS (я использую тот же js, который используется в демонстрационном файле Basic Plus), просто изменив переменную url на местоположение в UploadHandler.php файл

PHP (относительные части моего скрипта загрузки... Я использую скрипт по умолчанию Uploadhandler и пытаюсь настроить его для WordPress)

// Required WordPress files and hooks
require_once( $_SERVER['DOCUMENT_ROOT'] . "/wp-load.php" );
require_once( $_SERVER['DOCUMENT_ROOT'] . "/wp-admin/includes/media.php" );
require_once( $_SERVER['DOCUMENT_ROOT'] . "/wp-admin/includes/file.php" );
require_once( $_SERVER['DOCUMENT_ROOT'] . "/wp-admin/includes/image.php" );

$upload_dir = wp_upload_dir();

global $current_user;
get_currentuserinfo();
$logged_in_user = $current_user->ID;

// Some default blueimp code

// First few lines of the __construct function
global $upload_dir;
$this->options = array(
    'script_url' => $this->get_full_url(),
    'upload_dir' => $upload_dir['path'] . '/',
    'upload_url' => $upload_dir['url'] . '/',

// A lot more default script code

// The handle_file_upload function with WordPress customizations
protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
    $index = null, $content_range = null) {
    global $logged_in_user;
    $file = new stdClass();
    $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error,
    $index, $content_range);
    $file->size = $this->fix_integer_overflow(intval($size));
    $file->type = $type;
    if ($this->validate($uploaded_file, $file, $error, $index)) {
        $this->handle_form_data($file, $index);
        $upload_dir = $this->get_upload_path();
        if (!is_dir($upload_dir)) {
            mkdir($upload_dir, $this->options['mkdir_mode'], true);
        }
        $file_path = $this->get_upload_path($file->name);
        $append_file = $content_range && is_file($file_path) &&
            $file->size > $this->get_file_size($file_path);

        if ($uploaded_file && is_uploaded_file($uploaded_file)) {
            // multipart/formdata uploads (POST method uploads)
            if ($append_file) {
                file_put_contents(
                    $file_path,
                    fopen($uploaded_file, 'r'),
                    FILE_APPEND
                );
            } else {
                move_uploaded_file($uploaded_file, $file_path);
            }
        } else {
            // Non-multipart uploads (PUT method support)
            file_put_contents(
                $file_path,
                fopen('php://input', 'r'),
                $append_file ? FILE_APPEND : 0
            );
        }
        $file_size = $this->get_file_size($file_path, $append_file);
        if ($file_size === $file->size) {
            $file->url = $this->get_download_url($file->name);
            if ($this->is_valid_image_file($file_path)) {
                $this->handle_image_file($file_path, $file);
            }
        } else {
            $file->size = $file_size;
            if (!$content_range && $this->options['discard_aborted_uploads']) {
                unlink($file_path);
                $file->error = $this->get_error_message('abort');
            }
        }
        $this->set_additional_file_properties($file);
    }

    $attachment = array(
        'post_mime_type'    => $file->type,
        'post_title'        => preg_replace( '/\.[^.]+$/', '', basename( $file_path )),
        'post_content'      => '',
        'post_author'       => $logged_in_user,
        'post_status'       => 'inherit',
        'post_type'         => 'attachment',
        'guid'              => $this->options['upload_url'] . $name
    );

    $attachment_id = wp_insert_attachment( $attachment, $file_path );

    // Generate the attachment data
    $attachment_data = wp_generate_attachment_metadata( $attachment_id, $file_path );

    // Update the attachment metadata
    wp_update_attachment_metadata( $attachment_id, $attachment_data );

    return $file;
}

Обновленный выпуск:

Сначала кажется, что это работает... но, когда вы проверяете wp_posts database table, ничего не добавлено. Кроме того, при просмотре в media library отображается только загруженное изображение (ни одно из других изображений, находящихся в базе данных), и в error_log:

Предупреждение PHP: strpos() ожидает, что параметр 1 будет строкой, объект указан в /Applications/MAMP/htdocs/wordpress/wp-includes/post.php на линии 188 Предупреждение PHP: preg_match() ожидает, что параметр 2 будет строкой, объект указан в /Applications/MAMP/htdocs/wordpress/wp-includes/post.php на линии 188 Обнаруживаемая PHP фатальная ошибка: Объект класса stdClass не удалось преобразовать в строку в /Applications/MAMP/htdocs/wordpress/wp-includes/post.php в строке 189

Я понимаю тот факт, что переменная, которую я вызываю, является объектом, а не строкой, но я не уверен, что поставить на ее место.

Любая помощь приветствуется, я перепробовал все, что мог придумать. Действительно нужно запустить это как можно скорее! Спасибо

Author: fuxia, 2014-01-25

2 answers

После проведения тестов и работы с другом я смог найти решение:

Просто измените способ, которым функция get_full_url захватывает URL-адрес:

// Go to 'protected function get_full_url()'
// Line 200 (approx. if you've made the same changes stated above) in UploadHandler.php 
// change this line, should be the last one in the function
substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/'));

// After editing this is what you should end with
substr($_SERVER['DOCUMENT_ROOT'],0, strrpos($_SERVER['DOCUMENT_ROOT'], '/'));

Это то, что сработало для меня (вместе с настроенным кодом из вопроса), что позволило мне использовать демонстрационный загрузчик на пользовательской странице WordPress. Создание формы загрузки интерфейса! Надеюсь, это кому-то поможет.

 1
Author: Designer 17, 2014-02-07 13:13:05

Недавно я изменил страницу Wordpress, включив плагин загрузки файлов. На отдельной тестовой странице элемент управления, также измененный из образца basicplus, работал нормально. Однако в Wordpress загрузка не удалась. Я удалил оболочку формы, и это исправило ее.

 -1
Author: user3111957, 2014-02-06 20:28:38