如果没有附件,则发送消息,否则,描绘下载按钮

时间:2016-04-03 18:55:30

标签: javascript php html

我正在尝试实现类似这样的功能:

  1. 如果textarea有内容(非空)且未添加任何附件,则只需在div中显示该消息。
  2. 如果textarea为空,但添加了附件,则显示download按钮,这将强制消息接收者将附件保存到本地磁盘。
  3. 如果textarea不为空,并且添加了附件,则显示消息和下载按钮。
  4. 我目前的情况:

    目前,我有以下代码片段用于处理附件(目前只能是图像)。理想情况下,我不想在服务器上存储任何内容:

    首先,这是我的消息页面的可视化表示以及我如何显示我的消息:

    messages.php

    enter image description here

    这是我的代码:

    <?php
    /**************************************************/
    
    // 1. My textarea form for sending a message:
    echo "  <form action='messages.php?u=$user' method='post' enctype='multipart/form-data'>
                <textarea name='msg_body' rows='3' maxlength='255' cols='110' placeholder='Send message...'></textarea>
                <input type='submit' name='send' value='Send'/>
                <input id='file-input' name='attachment' type='file'/>
            </form>";
    
    /*
    When the above form is filled, the following states are considered valid:
       1.1. If the textarea is not empty and no attachment is added.
       1.2. If the textarea is empty but an attachment is added.
       1.3. If both textarea and attachment are empty, then DO NOT execute the INSERT query.
    */  
    /**************************************************/
    
    // 2. My approach to achieve the above and more...
    if ($user != $username) {
        if (isset($_POST['send'])) {
            $msg_body = (trim(strip_tags(@$_POST['msg_body'])));
            $date_of_msg = date("Y-m-d");
            $read = "no";
            $deleted = "no";
    
            // check if file is added and message is placed
            if (($_FILES['attachment']['size']) == 0 && ($_FILES['attachment']['error'] == 0) && $msg_body != "") {
                // do nothing
            } else {
                if (isset($_FILES['attachment'])) {
                    // check format of file
                    if (((@$_FILES["attachment"]["type"] == "image/jpg") 
                            || (@$_FILES["attachment"]["type"] == "image/jpeg") 
                            || (@$_FILES["attachment"]["type"] == "image/png") 
                            || (@$_FILES["attachment"]["type"] == "image/gif")) 
                            && (@$_FILES["attachment"]["size"] < 3145728)) //3mb 
                    {
                        if (file_exists("user_data/attached_files/".@$_FILES["attachment"]["name"])) {
                            // do nothing
                        } else {
                            // move temporary image files into one of the randomly generated files
                            move_uploaded_file(@$_FILES["attachment"]["tmp_name"], "user_data/attached_files/".@$_FILES["attachment"]
                                ["name"]);
                            // get name         
                            $attach_name = @$_FILES["attachment"]["name"];
                        }
                    }
                }
                $send_msg = mysqli_query($connect, "INSERT INTO private_messages VALUES ('','$username','$user', '$msg_body',
                    '$date_of_msg', '$read', '$deleted')
                ");
            } // 396 
            echo "<meta http-equiv='refresh' content='0'>";     
        }
    }
    /**************************************************/
    
    // 3. Now to display the download button (ONLY IF AN ATTACHMENT IS ADDED):
    
            if ($msg_to == $user){
                echo "  <div class='parent'> 
                            <div class='msg_prof'>
                            <img class='img-rounded' src='/user_data/profile_pics/$my_pro_pic'/>
                        </div>
                        <div class='new_msg_from_user'>
                             <p><b style= 'color: red;'> You said:</b> $msg_body</p>
                             <span class='faded'>$date </span>";
    
                    // check if file is empty
                    if (isset ($_FILES['attachment']['size']) == 0 && (isset($_FILES['attachment']['error'])) == 0){
                        // no file attached, so do nothing
                    } else {
                    echo "  <form action='inc/download_attachment.php' method='post' enctype='multipart/form-data'>
                                <button type='submit' name='save'> Download</button>
                            </form>";
                    }
                    echo "  <a href='inc/remove_message.php?id=$message_id'> Remove </a> 
                        </div><hr/>
                        </div>";
                    }
    
    ?>
    

    我目前的结果

    因此下图显示了我目前的结果。空的最后一个帖子(You said: "")是textarea中没有文本的帖子,但是添加了附件。

    enter image description here

    添加附件后,我需要下载按钮显示如下: enter image description here 按下下载按钮后,将调用download_attachment.php,这将强制用户将图像保存到本地磁盘。

    摘要

    • 如何在添加附件时显示下载按钮?
    • 如何阻止发送空消息? (即没有消息,也没有附件)。

    P.S。很抱歉很长的问题:)。

1 个答案:

答案 0 :(得分:3)

按顺序回答您的问题:

  

如何在添加附件时显示下载按钮?

挑战在于,PHP执行并由服务器端生成一次页面。因此,只有刷新页面(重新生成)时,您的逻辑才会起作用。但问题是你想要实现的目标是在客户端发生(通过点击Browne...按钮)因此我们需要使用JavaScript来解决这个问题。

因此我们默认情况下可以隐藏我们的按钮,但在我们与Browne...按钮互动时显示它。

一种方法,在代码末尾添加以下JavaScript

<script>
    document.getElementById("btnDownload").style.visibility = "hidden";
    document.getElementById("file-input").onchange = function () {
        document.getElementById("btnDownload").style.visibility = "visible";
    };
</script>

仅当您将if statement的下载按钮放在一边并为其指定id='btnDownload'时,此功能才有效。将它放在PHP中也是过度杀戮,所以只需将其保留为HTML,但是如果你想把它留在PHP中,那就记住要把它从任何条件/语句中取出来,因为我们需要从客户端控制它的外观

<form action='inc/download_attachment.php' method='post' enctype='multipart/form-data'>
    <button type='submit' name='save' id='btnDownload'> Download</button>
</form>

这是解决问题的一种方法,另一种方法是,当图像上传时,您需要在数据库表中添加一个字段,以告知文件/附件位置在哪里,以及该字段是否包含文件/附件位置,可以通过添加以下条件动态创建下载按钮。

if (!empty($attachment))
{
    // your button generation code.
}

我已经在我的测试环境中使用您的代码尝试了两种方法,并且两种方法都有效。

  

如何防止发送空消息? (即没有消息和   没有附件)。

您可以采用两种方式,可以添加额外条件!empty($_POST['msg_body'])来检查字段是否为空,因此您的代码将如下所示:

if ($user != $username)
{
    if (isset($_POST['send']) && !empty($_POST['msg_body'])){
        code inside etc.....
}

您也可以按照example之后的JavaScript来完成。

我做了什么的例子: enter image description here

  

注意:正如您可以看到当图像可用于一条消息时,图像按钮出现,我使用PHP / MySQL数据库或JavaScript同时使用这两种解决方案,但由于我对您的最终目标没有深入了解,因此我对你的问题的解决方案在工作和概念上是正确的,但你可能需要多做一些工作并将其刷新以适应你的最终目标。