如果没有附件,则发送消息,否则显示下载按钮。

3

我正在尝试实现一个功能,大致如下:

  1. 如果文本区域有内容(非空)且未添加附件,则仅在div中显示消息。
  2. 如果文本区域为空,但已添加附件,则显示下载按钮,该按钮将强制消息接收者将附件保存到本地磁盘。
  3. 如果文本区域不为空且已添加附件,则同时显示消息和下载按钮。

我的当前情况:

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

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

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个回答

3

按顺序回答您的问题:

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

挑战在于,PHP 会在服务器端执行并生成页面。因此,您的逻辑只有在刷新页面(重新生成)时才能起作用。但问题是,您所尝试实现的内容发生在客户端(通过单击“浏览...”按钮)。因此,我们需要使用 JavaScript 来解决这一部分。

因此,我们可以默认隐藏我们的按钮,但是在与“浏览...”按钮交互时立即显示它。

一种方法是,在代码结尾添加以下 JavaScript:

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

只有在将下载按钮放到if语句之外并给它一个像id='btnDownload'的ID时,它才能正常工作。同时,将其放入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.....
}

你还可以通过 JavaScript 来实现,按照这个示例

我所做的示例:enter image description here

注意:如您所见,当一条信息可用时,图像按钮出现。 我使用了 PHP/MySQL 数据库或 JavaScript 两种解决方案都可以工作,但由于我对您的最终目标没有深入了解,因此我的解决方案是可行的和概念上正确的,但您可能需要再努力一些并加以改进以使其符合您的最终目标。


再次问候,非常感谢迄今为止提供的所有帮助,但我知道我目前正在犯一些愚蠢的错误,无法使其顺利运行。您是否能够通过加入此聊天室进一步讨论?-http://chat.stackoverflow.com/rooms/108327/dynamically-appearing-download-button - Freddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接