View Full Version : [Generico] Pagina web che mostra e modifica files su disco
fbcyborg
28-05-2010, 16:55
Salve a tutti,
ho un server Linux sul quale ho la seguente esigenza:
leggere il contenuto di un file, mostrarlo a video, apportarne delle modifiche, renderle permanenti su disco e lanciare uno scriptino in bash.
Sono disposto a usare diversi linguaggi (PHP,Python,Jsp,HTML), però non so bene come cominciare.
Nello specifico, dovrei aprire un file, contenente una lista di URL e mostrarlo a video. Questa lista deve poter essere modificabile, ovvero si devono poter aggiungere/rimuovere URL e una volta fatto questo si deve rendere permanente la modifica su disco. Successivamente, come dicevo prima è necessario che si avvii uno script.
Come potrei fare? Qualcuno mi da degli spunti su come iniziare?
Idea buttata così, potrebbero esserci errori.
Per visualizzare/modificare/eliminare righe
- Fai qualche controllo per vedere se il file esiste, è leggibile e scrivibile
- Apri il file leggendo il contenuto di ogni riga in un array
- Dentro un form, cicli l'array e crei un textbox con il contenuto della riga (l'url), un id (magari l'url se univoco) più un pulsante per rimuovere la riga
Per aggiungere:
- Crei un bottone "generale" aggiungi che aggiunge una texbox per inserire un altro url.
Per salvare:
- un pulsante salva per salvare le modifiche, ossia aggiorni il contenuto dell'array con i valori che ti arrivano dalle textbox e riscrivi l'array nel file interamente.
consigli:
- il pulsante per far comparire un textbox io lo farei con javascript modificando il dom. Se fai fare un post, devi fare dei controlli per capire quale pulsante è stato premuto. E inoltre facendo il refresh della pagina, devi prevedere un meccanismo per salvare le altre textbox eventualmente modificate
- il pulsante rimuovi sarà problematico, perchè allo stesso modo dovrai salvare (nella sessione?) eventuali modifiche che l'utente ha fatto altre righe..
Scusa ho letto adesso che probabilmente non devi modificare le righe ma solo aggiungere e rimuoverle...:doh: la cosa si fa più semplice cmq :)
Infatti:
- pulsante rimuovi riga fa un post, rimuove dall'array e riscrive l'array nel file
- pulsante aggiungi riga (con relativo textbox) aggiunge nell'array e lo riscrive nel file
Non ti servono pulsanti salva, ma devi tenere in considerazione il caso in cui due utenti modificano questa lista contemporaneamente...
Ciao :)
fbcyborg
29-05-2010, 07:40
Grande, ti ringrazio.
L'idea mi piace.
Appena posso inizio a buttare giù qualche riga di codice. Per quanto riguarda l'accesso concorrente non c'è problema: lo usa una persona sola.
Mentre rispondevo a questo post mi è venuta in mente un'altra idea. Siccome sono molto più ferrato in Java che in altri linguaggi, una Servlet o una JSP, come la vedi?
clockover
29-05-2010, 08:00
Anche GWT magari...
fbcyborg
29-05-2010, 08:04
Google API, mi sembra di capire...
Mmh, no vorrei evitare di usare API di web services esterni in questo caso. :)
Con PHP si fa in pochi minuti ;)
Con PHP si fa in pochi minuti ;)
In ASP.net ancora di meno :asd: :asd:
Curiosità: c'è un modo per capire se il file è già aperto da un altro "utente" e bloccare ogni modifica? O bisogna trovare un escamotage tipo un lock su una tabella?
fbcyborg
29-05-2010, 13:18
ASP.net non lo conosco purtroppo.
PHP lo conosco poco per poterlo fare in pochi minuti!!!
Comunque intanto ho buttato giù qualche riga di codice stupidissima che mi legge il file una riga alla volta:
<?php
$file=fopen("urls","r"); //apre il file "urls"
while (!feof($file)) {
$buffer = fgets($file, 4096);
echo "$buffer"; //riga letta
}
fclose ($file); #chiude il file
?>
L'unica cosa intanto, è che non mi va a capo ogni riga. Anche se metto "\n" attaccato alla variabile buffer non va.
In ASP.net ancora di meno :asd: :asd:
A parte che ho qualche dubbio su questa affermazione (con questo non voglio dire che php è meglio di Asp.Net, ma sicuramente è più "sbrigativo" per progetti brevi e sopratutto per progetti di questo tipo), ma gli serviva Linux.
L'unica cosa intanto, è che non mi va a capo ogni riga. Anche se metto "\n" attaccato alla variabile buffer non va.
Per stampare i file metti tutto nel tag <pre> </pre>, oppure sostituisci "\n" con <br />.
Puoi leggere il file in una sola operazione:
http://php.net/manual/en/function.file.php
http://www.php.net/manual/en/function.file-get-contents.php
A parte che ho qualche dubbio su questa affermazione (con questo non voglio dire che php è meglio di Asp.Net, ma sicuramente è più "sbrigativo" per progetti brevi e sopratutto per progetti di questo tipo), ma gli serviva Linux.
La curva di apprendimento di php è più breve, per asp ci vuole un pò di più, ma asp ti permette di fare le cose più velocemente se lo sai usare...è risaputo :)
fbcyborg
29-05-2010, 13:44
Per stampare i file metti tutto nel tag <pre> </pre>, oppure sostituisci "\n" con <br />.
Puoi leggere il file in una sola operazione:
http://php.net/manual/en/function.file.php
http://www.php.net/manual/en/function.file-get-contents.php
Sì grazie avevo visto che si può leggere il file in una botta sola. Solo che vorrei poterli trattare separatamente per poterli aggiungere/rimuovere.
Sì grazie avevo visto che si può leggere il file in una botta sola. Solo che vorrei poterli trattare separatamente per poterli aggiungere/rimuovere.
In che senso ?
La curva di apprendimento di php è più breve, per asp ci vuole un pò di più, ma asp ti permette di fare le cose più velocemente se lo sai usare...è risaputo :)
Leggi bene quello che ho scritto perché la tua affermazione non è in contrasto con la mia ;)
<%@ Page Language="VB" Debug="true" %>
<script language="VB" runat="server">
Dim Reader As New System.IO.StreamReader(Server.MapPath("Ciao.txt"))
Response.Write(Reader.ReadToEnd())
Reader.Close
</script>
<?= file_get_contents("Ciao.txt") ?>
fbcyborg
29-05-2010, 13:51
In che senso ?
In pratica stavo pensando di caricare la lista di URL (contenuta appunto nel file) dentro un'array. Questo per facilitare l'operazione di aggiunta/rimozione delle righe (ogni riga corrisponde ad un URL). Quindi ogni volta che "do l'OK" o comunque che voglio apportare le modifiche al file, sovrascrivo il contenuto del file con il contenuto dell'array.
Io farei una pagina del genere:
ogni riga un url, con un tasto rimuovi a fianco.
Alla fine, una textbox con tasto aggiungi, che mi aggiorna la pagina con l'URL aggiunto, e in fondo, un bottone salva.
Se c'è bisogno posso pure fare uno schema di come lo vorrei fare.
Leggi bene quello che ho scritto perché la tua affermazione non è in contrasto con la mia ;)
Infatti infatti ;) l'avevo solo sottolineato :D
In pratica stavo pensando di caricare la lista di URL (contenuta appunto nel file) dentro un'array. Questo per facilitare l'operazione di aggiunta/rimozione delle righe (ogni riga corrisponde ad un URL). Quindi ogni volta che "do l'OK" o comunque che voglio apportare le modifiche al file, sovrascrivo il contenuto del file con il contenuto dell'array.
http://php.net/manual/en/function.file.php :D
Se c'è bisogno posso pure fare uno schema di come lo vorrei fare.
Quando si tratta di php e pagine complesse per quanto riguarda il flusso di esecuzione ti consiglio di fare appunto i driagrammi di flusso! E' un ottimo modo per documentare il codice...così' tra 2 settimane non impazzisci riguardando la pagina :D
Per modificare il file: http://php.net/manual/en/function.file-put-contents.php
Fai un implode con tutte le righe rimanenti. Ovviamente devi togliere dal vettore le righe che vuoi rimuovere.
Una cosa del genere:
$content = file("prova.txt");
unset $content[$x]; //rimuovi la riga di indice $x
array_push($content, $new_line."\n"); //aggiunge una riga in fondo
file_put_contents("prova.txt", implode($content));
Qualche ideuzza. Per rendere tutto un po' più chiaro io userei qualche semplice oggetto. Non so a che livello di esperienza sei, comunque farei un oggetti "Url" e (php lo supporta?) una lista di url che li contiene estendendo i metodi delle liste. Url potrebbe avere:
Classe Url:
Private Id string
Private string target;
public string getId();
public boolean isValid();
public boolean exists();
in questo modo gestiresti eventuali modifiche future in scioltezza (controllare se un url esiste o se è valido e tanto altro).
Mentre nell'oggetto lista di Url:
public new (string FileName);
public Url getElement(string Id);
public void removeElement(Url url);
public void addElement(Url url);
public void saveContent();
public void sort(); #opzionale
public void removeDuplicates(); #opzionale
Così semplifichi anche la parte di visualizzazione e separi le due cose. In fase di visualizzazione:
# Carichi la lista
Urls myurls = new Urls("Ciao.txt");
#Iteri e crei i pulsanti
for each (Url u in myurls)
{
echo "<input type='text' id ='" . u-> id . "' value='".ud->target."' />;
}
Ovviamente sto parlando in pseudo codice :D ;)
fbcyborg
30-05-2010, 16:10
Dunque non ho per niente esperienza a livello di programmazione ad oggetti in php, ma mi ricorda quello che di solito vedo in Java (con cui ho sicuramente mooolta più dimestichezza).
Dunque, per il momento, dopo aver letto la documentazione segnalata da cionci, ho riscritto le prime righe di codice così:
<?php
$lines = file("urls");
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
?>
Ora vorrei poter mettere un bottone elimina a fianco ad ogni riga, e magari in testa alla pagina un campo di testo con bottone aggiungi, che mi aggiorna l'array e la pagina stessa, con la lista degli url aggiornati. A questo punto immagino sia necessario anche JavaScript.
Dipende, se vuoi che la pagina venga ricaricata o meno.
Se non vuoi che venga ricaricata ti serve JavaScript. Se vuoi che venga ricaricata basta mettere un bottone ed andarsi a prendere i valori della form da PHP.
fbcyborg
30-05-2010, 16:33
Dipende. Comunque sì, mi piacerebbe che la pagina si ricaricasse con la lista aggiornata ogni volta, ad ogni operazione di inserimento/rimozione.
Es. Parto con la lista, aggiungo un URL, clicco sul bottone aggiungi, e la pagina si ricarica con la lista aggiornata.
Se voglio rimuovere un URL, clicco sul relativo bottone "rimuovi" affiancato all'url che voglio rimuovere e ricarico la pagina con il nuovo array.
Alla fine di tutto, mi servirebbe un pulsante "applica modifiche" (possibilmente sempre in cima alla pagina per comodità), che scriva su file (appunto con il metodo visto in precedenza) e lanci uno script in bash, presente sul server.
Intanto quello che stavo cercando di fare è di mettere un bottone rimuovi a fianco di ogni URL. Poi mi chiedevo come potrei usarlo per rimuovere dall'array, l'i-esimo url/riga.
Dipende. Comunque sì, mi piacerebbe che la pagina si ricaricasse con la lista aggiornata ogni volta, ad ogni operazione di inserimento/rimozione.
Es. Parto con la lista, aggiungo un URL, clicco sul bottone aggiungi, e la pagina si ricarica con la lista aggiornata.
Se voglio rimuovere un URL, clicco sul relativo bottone "rimuovi" affiancato all'url che voglio rimuovere e ricarico la pagina con il nuovo array.
Alla fine di tutto, mi servirebbe un pulsante "applica modifiche" (possibilmente sempre in cima alla pagina per comodità), che scriva su file (appunto con il metodo visto in precedenza) e lanci uno script in bash, presente sul server.
Mettere delle checkbox per permettere l'eliminazione d + elementi? Cmq se vuoi che alla fine di tutto ci sia applica modifiche, devi salvarti l'array nella sessione...
Intanto quello che stavo cercando di fare è di mettere un bottone rimuovi a fianco di ogni URL. Poi mi chiedevo come potrei usarlo per rimuovere dall'array, l'i-esimo url/riga.
Devi studiarti come funzionano le form e come recuperare i valori al post, è di fondamentale importanza saperlo...in qualsiasi linguaggio!
fbcyborg
30-05-2010, 16:40
Sì, alla fine anche delle checkbox vanno bene, anzi, anche meglio direi.
Cavolo, mi sto rendendo conto che forse non ho abbastanza esperienza per fare questa cosa. Sebbene le abbia trattate qualche volta, con le sessioni non ci ho mai lavorato seriamente.
PS ovviamente fai tutto con POST anche se non è bellissimo (per gli avvisi del browser, quando torni indietro). Il motivo è abbastanza chiaro...
Sì, alla fine anche delle checkbox vanno bene, anzi, anche meglio direi.
Cavolo, mi sto rendendo conto che forse non ho abbastanza esperienza per fare questa cosa. Sebbene le abbia trattate qualche volta, con le sessioni non ci ho mai lavorato seriamente.
Non sono nulla di che, te l'assicuro... è più complesso capire una volta inviata la pagina, quale elemento eliminare..
Ti serve:
<input type="checkbox" name="nome" value="valore">
1 ciclo
la funzione isset
l'array fornito dal server $REQUEST
Con queste 3 cose puoi capire se un checkbox è stato selezionato o meno e agire di conseguenza
Per poter mettere un pulsante Applica devi anche usare le sessioni, andando a memorizzare il vettore delle righe nella sessione.
fbcyborg
30-05-2010, 18:38
Ok Ok, allora appena posso mi vado a "ripassare" le sessioni! :D Poi possiamo ritornare in argomento! :)
Grazie! ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.