File Browser

lunedì 05 luglio 2010 - 10.43

albertoparisi Profilo | Newbie

Salve a tutti ho realizzato spulciando un po la rete come realizzare un piccolo file browser; ora per quanto riguarda la stampa sulla mia pagina web dei file da visualizzare tutto fila liscio ora avrei bisogno di renderli scaricabili e qui sorgono un pò di problemi:

protected void Page_Load(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo("C:\\Log\\Log1");
FileInfo[] fiArr = di.GetFiles();
foreach (FileInfo fi in fiArr)
{
Response.Write("<a href='" + fi.Name + "'>" + fi.Name + "<br>");
}
//download(fi);
}
private void download(FileInfo fi) {
Response.ClearContent();
Response.AddHeader("Content-Disposition", "attachment; filename=" + fi.Name);
Response.AddHeader("Content-Length", fi.Length.ToString());
Response.ContentType = ReturnExtension(fi.Extension.ToLower());
Response.TransmitFile(fi.FullName);
Response.End();
}
private string ReturnExtension(string fileExtension){
switch (fileExtension)
{
case ".htm":
case ".html":
case ".log":
return "text/HTML";
case ".txt":
return "text/plain";
case ".doc":
return "application/ms-word";
case ".tiff":
case ".tif":
return "image/tiff";
case ".asf":
return "video/x-ms-asf";
case ".avi":
return "video/avi";
case ".zip":
return "application/zip";
case ".xls":
case ".csv":
return "application/vnd.ms-excel";
case ".gif":
return "image/gif";
case ".jpg":
case "jpeg":
return "image/jpeg";
case ".bmp":
return "image/bmp";
case ".wav":
return "audio/wav";
case ".mp3":
return "audio/mpeg3";
case ".mpg":
case "mpeg":
return "video/mpeg";
case ".rtf":
return "application/rtf";
case ".asp":
return "text/asp";
case ".pdf":
return "application/pdf";
case ".fdf":
return "application/vnd.fdf";
case ".ppt":
return "application/mspowerpoint";
case ".dwg":
return "image/vnd.dwg";
case ".msg":
return "application/msoutlook";
case ".xml":
case ".sdxl":
return "application/xml";
case ".xdp":
return "application/vnd.adobe.xdp+xml";
default:
return "application/octet-stream";
}
}

Ora ho testato il metodo download e sono certo funzioni, ora non riesco a capire come posso scaricare i file che stampo con il foreach nel metedo Page_Load o per meglio dire come faccio a passare a download() l'identificativo del file che voglio caricare?

Grazie a tutti quelli che perderanno un pò di tempo per me purtroppo sono un novellino e sono disperato non so come fare :)

Gluck74 Profilo | Guru

non ti scrivo tutto il codice ma ti do soltanto le linee guida:

- Nalla pagina inserisci un asp:panel
- nel ciclo non fai un response.write ma aggiungi dei controlli linkbutton al pannello che fungerà da contenitore.
- ogni linkbutton dovrò avere come parametro (CommandArgument) un identificativo del file (scegli tu, il nome del file potrebbe andare)
- ai linkbutton assocli per l'evento click una routine (esempio link_click)
- nella routin grazie al parametro commandArgument, ricrei l'oggetto FileInfo del file cliccato e lo passi alla funzione Download

Spero che questo sia sufficente.
Ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

albertoparisi Profilo | Newbie

Ciao Gluck, grazie per il tempo che mi hai dedicato. Sono estremamente novello di .NET e sto cercando di entrare nell ordine delle idee.
Allora:
Quando aggiungo nella pagina .aspx un linkbutton devo aggiungerne uno solo o uno per ognuno dei file che ho a disposizione? perchè io il numero dei file lo determino nel ciclo foreach.

Per quanto riguarda il CommandArgument io non conosco il nome del file fin quanto non ho la stampa sempre fatta dal mio ciclo nella pagina .cs come dovrei specificare il commandArgument?

Per quanto riguarda l'associazione del linkbutton con una rutine credio sia piuttosto semplice, in pratica basta specificare la proprietà OnClick="LinkButton_Click" e poi creare nella mia pagina .CS il relativo metodo void LinkButton_Click(Object sender, EventArgs e) solo che mi è ancora ignaro come poterlo implementare.

Faccio un rissunto del codice:
DEFAULT.ASPX:
------------------
<asp:Panel ID="Panel1" runat="server">
<asp:LinkButton id="LinkButton1"
Text="Click Me"
Font-Name="Verdana"
Font-Size="14pt"
CommandArgument="nome del mio file?????????????"
OnClick="LinkButton_Click"
runat="server"/>
</asp:Panel>

DEFAULT.ASPX.CS:
-----------------------
protected void Page_Load(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo("C:\\Log\\Log1");
FileInfo[] fiArr = di.GetFiles();
foreach (FileInfo fi in fiArr)
{
//LinkButton.ReferenceEquals(fi.Name);
LinkButton1.Add(fi.Name); <-- come aggiungo i vari LinkButton?
}
}
void LinkButton_Click(Object sender, EventArgs e) {
download(e.CommandName) <- e come posso passare poi l'argomento a download
}

Grazie ancora, immagino che ti stia importunando :) spero di riuscire a fine "travaglio" di poter scrivere un piccolo tutorial su come realizzare un file browser con possibilità di scaricare file magari può sempre tornare utile a qualcun altro.

Alberto

Gluck74 Profilo | Guru

he he... vedo che sei proprio all'inizio..........
allora qualche suggerimento in più:

>Quando aggiungo nella pagina .aspx un linkbutton devo aggiungerne
>uno solo o uno per ognuno dei file che ho a disposizione? perchè
>io il numero dei file lo determino nel ciclo foreach.
Nella pagina aspx, devi aggiungere SOLO il pannello. Tutto il resto lo aggiungi da codice dentro il ciclo foreach.


>Per quanto riguarda il CommandArgument io non conosco il nome
>del file fin quanto non ho la stampa sempre fatta dal mio ciclo
>nella pagina .cs come dovrei specificare il commandArgument?
aggiungendo dinamicamente i linkbutton dentro il ciclo, assegni direttamente al commandargument il nome del file preso dall'elemento del ciclo foreach

>
>Per quanto riguarda l'associazione del linkbutton con una rutine
>credio sia piuttosto semplice, in pratica basta specificare la
>proprietà OnClick="LinkButton_Click" e poi creare nella mia
>pagina .CS il relativo metodo void LinkButton_Click(Object sender,
>EventArgs e) solo che mi è ancora ignaro come poterlo implementare.
stessa cosa come sopra, dentro il ciclo assegni la funzione

ed ecco il codice al completo:
foreach (FileInfo fi in fiArr) { LiteralControl litBR = new LiteralControl(); litBR.Text = "<br />"; LinkButton lnk = new LinkButton(); lnk.Text = fi.FullName; lnk.CommandArgument = fi.FullName; lnk.Command += new CommandEventHandler(lnk_Command); pnlFile.Controls.Add(lnk); pnlFile.Controls.Add(litBR); }

supponendo che "pnlFile" sia l'ID del pannello contenitore. Puoi anche notare una finezza: l'aggiunta di un literal per inserire un BR alla fine di ogni link.
Inoltre la funzione che verrà richiamata al click sul link, sarà questa:
void lnk_Command(object sender, CommandEventArgs e) { string arg = e.CommandArgument.ToString(); FileInfo fi = new FileInfo("arg"); download(fi); }


ma a questo punto mi sorge una domanda: hai proprio bisogno della funzione download???
se nella cartella hai solo file di determinati tipi, ovvero sei sicuro di avere SOLO file scaricabili direttamente dagli utenti, fai che mettere solo un link!!!!

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

albertoparisi Profilo | Newbie

Fantastico funziona tutto,
si effettivamente si potrebbe fare con gli HyperLink ma fammi capire (approposito in ambiente .NET sono il re dei pivelli ) implementandolo con gli HyperLink non avrei bisogno della funzione download?
Se riesco a migliorarlo posto la soluzione completa per ora ti ringrazio e magari se hai da consigliarmi qualche link con qualche tutorial per fare pratica sono ben accetti ;)

Ciau

Gluck74 Profilo | Guru

Potresti provare, io purtoppo in questo momento non posso fare test, ma in genere quando linki semplicemente un file, ti parte in automatico la finestrella di download con "Salva", "Apri", "Annulla" del browser.


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

albertoparisi Profilo | Newbie

Ma teoricamente ho letto in giro che il modo più semplice per farlo era appunto questo ora con questo:
protected void Page_Load(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo("C:\\Log\\Log1");
FileInfo[] fiArr = di.GetFiles();
foreach (FileInfo fi in fiArr)
{
Response.Write("<a href='" + fi.Name + "'>" + fi.Name + "<br>");
}
}
Dovrebbe fare esattamente quello che dici ma quando schiaccio sul download non ne vuole sapere di scaricare il file.

Invece tornando a noi ora stavo cercando di smanettare e pensavo di aggiungere anche un immagine ai link che stampo, ora seguendo lo stesso ragionamento per i linkbutton o gli oggetti literalcontrol (ottima dritta ;) ) ho prodotto questa modifica al metodo page_load

protected void Page_Load(object sender, EventArgs e)
{

DirectoryInfo di = new DirectoryInfo(@"C:\Log\log1");
FileInfo[] fiArr = di.GetFiles();
foreach (FileInfo fi in fiArr)
{
LiteralControl litBR = new LiteralControl();
litBR.Text = "<br />";
Image a = new Image();
a.ImageUrl = "~/immagini/FolderClose.bmp";
LinkButton lnk = new LinkButton();
lnk.Text = fi.Name;
lnk.CommandArgument = fi.FullName;
lnk.Command += new CommandEventHandler(lnk_Command);
pnlFile.Controls.Add(lnk);
pnlFile.Controls.Add(litBR);
pnlFile.Controls.Add(a);
}
}

e con mia grande sorpresa funziona :D se non fosse che mi stampa un imagine in più rispetto ai link :(

Gluck74 Profilo | Guru

>foreach (FileInfo fi in fiArr)
>{
>Response.Write("<a href='" + fi.Name + "'>" + fi.Name +
>"<br>");
>}
>}
>Dovrebbe fare esattamente quello che dici ma quando schiaccio
>sul download non ne vuole sapere di scaricare il file.

si infatti, ma cosa intendi per "schiaccio su download"???? hai mica un pulsante?? no vero!?!?!?!?!?!?!?!?
Devi cliccare semplicemente sul link con il nome del file, ma stai attento al href!!!!!!
correggi con:
Response.Write("<a href='" + fi.FullName + "'>" + fi.Name +"<br>");
e controlla nel codice HTML che venga scritto tutto il percorso corretto.


>e con mia grande sorpresa funziona :D se non fosse che mi stampa
>un imagine in più rispetto ai link :(
carina l'idea di mettere l'immagine, ma in che senso ti stampa un'immagina in più??


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

albertoparisi Profilo | Newbie

Scusa mi sono espresso male intendevo dire che quando schiaccio sul link non mi partiva il download, ora che mi ci hai fatto fare caso ho ritestato il tutto impostanto il percorso intero nel href come da te sugerito ma quando provo a scaricarlo mi dice: impossibile aprire questo indirizzo: il protocollo (c) non è associato a nessun programma .. mah non capisco proprio perchè con gli hyperlink non ne vuole sapere di funzionare..vabbè..

Per quanto riguarda il codice che funge :D per farti capire se io ho 13 file all'interno della cartella che imposto come path i file vengo visualizzati tutti senza problemi così come le relative immagini solo che rispetto ai file sono una in più, quindi avrò una lista di 13 file con affianco la propria iconcina tranne l'ultima riga dove ho l'immagine stampata ma non c'è alcun link (giustamente in quanto il numero dei file visualizzati è corretto). mah cosa piuttosto strana è come se ci fosse un ciclo del foreach con non riesco ad individuare

Gluck74 Profilo | Guru

>Scusa mi sono espresso male intendevo dire che quando schiaccio
>sul link non mi partiva il download, ora che mi ci hai fatto
>fare caso ho ritestato il tutto impostanto il percorso intero
>nel href come da te sugerito ma quando provo a scaricarlo mi
>dice: impossibile aprire questo indirizzo: il protocollo (c)
>non è associato a nessun programma .. mah non capisco proprio
>perchè con gli hyperlink non ne vuole sapere di funzionare..vabbè..

scusa, ho sbagliato io a darti il suggerimento.
Inpratica, unfile per essere scaricato, deve avere un percorso si assoluto, ma basato sul web e non sul disco.
Ammettiamo ad esempio che i file stiano nella cartella "toDownload" sotto il tuo sito web, e che il sito stia nella classica cartella inetPub.
Il link non deve essere, come ho detto erroneamente "C:\inetpub\wwwroot\sito\todownload",
ma piuttosto "www.sito.it\todownload" o anche "\\xxx.xxx.x.xx\todownload" (indirizzo IP).


>
>Per quanto riguarda il codice che funge :D per farti capire se
>io ho 13 file all'interno della cartella che imposto come path
>i file vengo visualizzati tutti senza problemi così come le relative
>immagini solo che rispetto ai file sono una in più, quindi avrò
>una lista di 13 file con affianco la propria iconcina tranne
>l'ultima riga dove ho l'immagine stampata ma non c'è alcun link
>(giustamente in quanto il numero dei file visualizzati è corretto).
>mah cosa piuttosto strana è come se ci fosse un ciclo del foreach
>con non riesco ad individuare
controlla l'html. se ti ha inserito l'immagine, ha inserito anche il link e il br. Che c'è scritto nel link? è vuoto??

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5