考虑到安全性和易用性,处理前端文件上传


8

我正在寻找一种现有的类似论坛的插件,该插件没有附加媒体的功能。

该插件可作为“自定义帖子类型”使用,因此就像将图像附加到帖子一样“简单”。

我只关心附加图像而不是附加任何文件类型,但是该插件确实使用了wp_editor,因此该解决方案应该以某种方式与之集成。只要解决方案能够将图像的缩略图插入tinyMCE文本区域,我就不会为创建tinyMCE按钮而大惊小怪。

请注意,我指的是我网站的前端,而不是管理区域。

在绝对理想的情况下,我希望发生这种情况:

  • 用户单击“问问题”
  • 使用输入他们的帖子详细信息
  • 用户单击tinyMCE界面上的一个按钮,类似于StackExchange,该按钮要求用户上载文件。
  • 然后,系统将正确大小的缩略图插入到tinyMCE文本区域中,并将文件压缩为该缩略图大小
  • 单击此图像应提供与帖子中图像附件相同的功能
  • 然后,用户可以再次单击以插入新图像
  • 用户还可以根据需要从tinyMCE文本区域删除图像

但是,我对tinyMCE按钮具有外围功能感到高兴-如果“文件上载”框明显更容易,那就很好。

我碰到了这个链接,但我总是对在t'interweb上阅读WordPress文章感到不安,因为我永远不太确定它们的安全性,我也不是任何想像力的php安全专家。

提前致谢,


我知道该特定教程的作者。ping他,以便他可以更具体地回答您的问题……
EAMann 2012年

问题:如果您已经在使用该wp_editor()功能,为什么不只使用其中包含的媒体上载厚框呢?我没有wp_editor在前端使用过,但是有些人已经成功地将其用于图像上传,例如,请参见此处 ...
goldenapples 2012年

谢谢EAMann。goldenapples可能更可取,但是插件作者说允许访问wp_editor的媒体上载将使任何级别的用户都可以访问我的整个媒体库吗?我完全不想这样-只是让他们自己上传。
dunc 2012年

啊,是的。我没想到那个问题。我已经有media-upload.php一段时间没有看过源文件了,但是我很确定media_upload_tabs上有一个过滤器,您可以在其中禁用“媒体库”标签。我会看一下,然后看……
goldenapples

Answers:


4

我认为最简单的方法是,由于您已经在使用该wp_editor功能,因此将媒体按钮仅包含在WP_Editor实例中-这样,您将拥有本机功能,包括内置的“插入帖子”按钮免费。

您如何执行此操作显然取决于您要使用的插件。但是,这应该可以帮助您入门。在页面模板中包含这样的代码以显示编辑器,您将在页面上获得一个编辑器。将其包括在表单中并处理结果是此处未详述的另一个步骤。

// Define the global variable $post_id - this is used by the media uploader
// to attach uploads to a specific post (so that the uploader can see uploads
// attached to this post and not others)
global $post_id;
$post_id = $post->ID; // should be the ID of the new post created

// Now filter the list of tabs available in the media editor.
// Remove everything but the "From Computer" option.

add_filter( 'media_upload_tabs', 'wpse42068_remove_additional_tabs' );

function wpse42068_remove_additional_tabs( $_default_tabs ) {
    return array( 'type' => __('From Computer') );
}

// Now just include the WP_Editor. See
// http://codex.wordpress.org/Function_Reference/wp_editor
// for settings available
wp_editor( '', 'posteditor', array( 'media_buttons' => true ) );

定义帖子ID可能是关键部分,而如何执行将取决于功能的逻辑。我会建议:

  • 在首次访问此页面时创建自动草稿,并将返回的帖子ID保存在全局$ post_id变量中。
  • 然后在提交表单时使用相同的ID保存创建的帖子。

对于初学者来说不容易理解。无论如何还是要感谢
白纸上的白纸

6

也许这不是您理想的解决方案,但值得一试。通过谷歌搜索获得了它,但是不幸的是我忘记了网址。附加部分与@goldenapples文章中的相似。

这是基本功能。

function attach_uploads($uploads,$post_id = 0){
    $files = rearrange($uploads);
    if($files[0]['name']==''){
        return false;   
    }
    foreach($files as $file){
        $upload_file = wp_handle_upload( $file, array('test_form' => false) );
        $attachment = array(
        'post_mime_type' => $upload_file['type'],
        'post_title' => preg_replace('/\.[^.]+$/', '', basename($upload_file['file'])),
        'post_content' => '',
        'post_status' => 'inherit'
    );
        $attach_id = wp_insert_attachment( $attachment, $upload_file['file'], $post_id );
        $attach_array[] = $attach_id;
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata( $attach_id, $upload_file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_data );
    }
    return $attach_array;
}

Ajax功能

add_action('wp_ajax_attach_file', 'process_attach_file');
function process_attach_file() {

    // add some filter and validation on the id and the files here
    $post_id = $_POST['post_id'];
    $files = $_FILES['profile-picture'];

    // insert attachment
    $attached_files = attach_uploads($files,$post_id);

    // set the first file as post thumbnail
    if($attached_files){
        set_post_thumbnail( $post_id, $attached_files[0] ); 
    }

    // now all you have to do is set the response data

}

标记

<form id="upload-form" action="<?php echo admin_url('admin-ajax.php'); ?>" method="post" class="form" enctype="multipart/form-data" >
    <label for="profile-picture">Foto Profil</label>
    <input type="file" id="profile-picture" name="profile-picture[]" size="40" multiple />
    <?php wp_nonce_field( // intention nonce); ?>
    <input name="action" value="attach_file" type="hidden">
    <input name="post_id" value="12" type="hidden">
</form>

希望有帮助


您能否总结一下此功能的作用?
2012年

1
当然。第一个功能是处理文件上传的功能。首先,它会重新排列上载的文件数组,使其适合于“ foreach”循环。
ifdion '02

1
wp_handle_upload将上载的文件放在wp-content / uploads目录中。wp_insert_attachment捕获文件信息并将其另存为附件在wp_posts表中。wp_generate_attachment_metadata wp_update_attachment_metadata 说什么。第二部分是ajax函数,使用该attach uploads函数处理标记上显示的表单。
ifdion 2012年

1
重排功能[link](php.net/manual/en/features.file-upload.multiple.php)的其他参考
ifdion 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.