File Upload from Frontend

Before Header:

<?php 
    $post_id = $post->ID;
    if ( isset( $_POST['html-upload'] ) && ! empty( $_FILES ) ) {
        require_once( ABSPATH . 'wp-admin/includes/admin.php' );
        $id = media_handle_upload( 'async-upload', $post_id ); //post id of Client Files page
        unset( $_FILES );
        if( is_wp_error( $id ) ) {
            $errors['upload_error'] = $id;
            $id = false;
        }

        if( $errors ) {
            echo "<p>There was an error uploading your file.</p>";
        } else {
            echo "<p>Your file has been uploaded.</p>";
        }
    }
?>

After that, add this where you want your form:

<?php if ( is_user_logged_in() ) {      ?>

    <form id="file-form" enctype="multipart/form-data" action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="POST">
        <p id="async-upload-wrap"><label for="async-upload">File Upload:</label>
        <input type="file" id="async-upload" name="async-upload"> <input type="submit" value="Upload" name="html-upload"></p>

        <p><input type="hidden" name="post_id" id="post_id" value="<?php echo $post_id ?>" />
        <?php wp_nonce_field( 'client-file-upload' ); ?>
        <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" /></p>

        <p><input type="submit" value="Save all changes" name="save" style="display: none;"></p>
    </form>

<?php } ?>