Se nessun allegato, quindi inviare un messaggio, altrimenti, ritrarre il pulsante di download

Sto cercando di implementare una funzionalità che va in questo modo:

  1. Se textarea ha contenuto (non vuoto) e nessun allegato è aggiunto, quindi basta visualizzare il messaggio nel div.
  2. Se textarea è vuota, ma viene aggiunto un allegato, viene visualizzato il pulsante di download , che imporrà al destinatario del messaggio di salvare l’allegato sul disco locale.
  3. Se textarea non è vuota e viene aggiunto l’allegato, visualizza sia il messaggio che il pulsante di download.

La mia situazione attuale:

Attualmente, ho il seguente frammento di codice per l’elaborazione dell’allegato (che al momento può essere solo un’immagine). Idealmente, non voglio memorizzare nulla sul server:

In primo luogo, ecco una rappresentazione visiva della mia pagina dei messaggi e come visualizzo i miei messaggi:

messages.php :

inserisci la descrizione dell'immagine qui

Ecco il mio codice:

 <?php /**************************************************/ // 1. My textarea form for sending a message: echo " 
"; /* 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/"[email protected]$_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/"[email protected]$_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 ""; } } /**************************************************/ // 3. Now to display the download button (ONLY IF AN ATTACHMENT IS ADDED): if ($msg_to == $user){ echo "

You said: $msg_body

$date "; // check if file is empty if (isset ($_FILES['attachment']['size']) == 0 && (isset($_FILES['attachment']['error'])) == 0){ // no file attached, so do nothing } else { echo "
"; } echo " Remove

"; } ?>

I miei risultati attuali :

Quindi l’immagine sotto mostra i miei risultati attuali. L’ultimo post che è vuoto ( You said: "" ) era un post senza testo nella textarea, ma ha aggiunto un allegato.

inserisci la descrizione dell'immagine qui

Quando viene aggiunto un allegato, ho bisogno che il pulsante di download appaia in questo modo: inserisci la descrizione dell'immagine qui Il pulsante di download, una volta premuto, chiamerà download_attachment.php che costringerà l’utente a salvare l’immagine sul disco locale.

Riepilogo :

  • Come faccio a mostrare il pulsante di download solo quando viene aggiunto un allegato?
  • Come impedire che vengano inviati messaggi vuoti? (cioè nessun messaggio e nessun allegato).

Ps Scusa per la domanda molto lunga :).

Rispondere alla tua domanda in ordine:

Come faccio a mostrare il pulsante di download solo quando viene aggiunto un allegato?

La sfida è che PHP viene eseguito e generare la pagina una volta dal lato server. Quindi la tua logica funzionerà solo quando la pagina viene aggiornata (rigenerata). Ma il problema è che ciò che stai cercando di ottenere sta accadendo dal lato client (facendo clic sul pulsante Browne... ) Quindi è necessario utilizzare JavaScript per risolvere questa parte.

Quindi, per impostazione predefinita, possiamo hide il nostro pulsante, ma visualizzarlo nel momento in cui interagiamo con il pulsante Browne...

Un modo per andare, aggiungendo il seguente codice JavaScript alla fine del codice

  

Questo funzionerà solo se si porta il pulsante di download fuori dall’istruzione if statement e gli si fornisce un id come id='btnDownload' . È anche eccessivo metterlo in PHP, quindi basta lasciarlo come HTML, ma se vuoi lasciarlo dentro PHP, allora ricordati come detto di toglierlo da qualsiasi condizione / affermazione dato che dobbiamo controllarne l’aspetto dal lato Client .

 

Questo è un modo per risolverlo, l’altro modo è, quando l’immagine viene caricata, è necessario aggiungere un campo nella tabella del database per indicare dove si trova il percorso del file / allegato, e se quel campo ha il percorso file / allegato, puoi creare dynamicmente un pulsante di download aggiungendo la seguente condizione.

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

Ho provato entrambi i metodi sul mio ambiente di test con il tuo codice ed entrambi funzionano.

Come impedire che vengano inviati messaggi vuoti? (cioè nessun messaggio e nessun allegato).

Puoi andare in due modi, puoi aggiungere condizioni extra !empty($_POST['msg_body']) per verificare se il campo non è vuoto, quindi il tuo codice sarà simile a questo:

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

Puoi anche farlo da JavaScript seguendo questo esempio .

Esempio di cosa ho fatto: inserisci la descrizione dell'immagine qui

Nota: Come puoi vedere il pulsante immagine appare quando l’immagine è disponibile per un messaggio, l’ho fatto sia con il database PHP / MySQL O JavaScript e entrambe le soluzioni funzionano, ma poiché non ho una conoscenza approfondita del tuo objective finale, quindi la mia soluzione per la tua domanda è funzionante e concettualmente corretta, ma potresti dover lavorare un po ‘di più e spazzolarla per adattarla al tuo objective finale.