Я пытаюсь реализовать функцию, которая выглядит примерно так:
download
, которая заставит приемник сообщений сохранить вложение на локальный диск. Моя нынешняя ситуация:
В настоящее время у меня есть следующий фрагмент кода для обработки вложения (который на данный момент может быть только изображением). В идеале, я не хочу ничего хранить на сервере:
Во-первых, здесь представлено визуальное представление моей страницы сообщений и способы отображения моих сообщений:
messages.php :
Вот мой код:
<?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("Ymd"); $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: ""
), было опубликовано без текста в текстовом поле, но добавлено вложение.
Когда приложение добавлено, мне нужно, чтобы кнопка загрузки выглядела так: Кнопка загрузки после нажатия вызывает функцию download_attachment.php
которая заставит пользователя сохранить изображение на локальный диск.
Резюме :
Ps Извините за очень длинный вопрос :).
Отвечая на ваш вопрос в порядке:
Как показывать только кнопку загрузки при добавлении вложения?
Задача состоит в том, чтобы 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>
Это будет работать, только если вы id='btnDownload'
кнопку загрузки из 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..... }
Вы также можете сделать это с помощью JavaScript в этом примере .
Пример того, что я сделал:
Примечание. Как вы можете видеть, кнопка изображения появляется, когда изображение доступно для одного сообщения, я сделал это как с базой данных PHP / MySQL, так и с JavaScript, и оба решения работают, но поскольку у меня нет глубоких знаний о вашей конечной цели, поэтому мое решение ваш вопрос работает и концептуально корректен, но вам, возможно, потребуется немного поработать и почистить его, чтобы он соответствовал вашей конечной цели.