Delphi for DotNet – WebForm per fare l’upload di un file
COME CREARE UNA PAGINA PER ESEGUIRE GLI UPLOAD CON ASP.NET IN DELPHI PER .NET
A differenza del caro e buon veccio Asp in cui creare una pagina di upload era simile ad un parto, nel nuovo ambiente .Net di Microsoft la cosa è resa molto più semplice grazie all’introduione della classe : System.Web.UI.HtmlControls.HtmlInputFile.
In questo esempio viene creata una pagina ASP.Net da inserire nel vs. progetto per poter permettere agli utenti di eseguire un upload di un file.
Come ben sapete una pagina ASP.Net in delphi 8.0 costituita dal relativo file .aspx e dal code behind contenuto nella dll del progetto. Il “code behind” viene generato in funzione del file della pagina .pas (scritto nel classico object pascal).
Analizziamo cosa dobbiamo inserire nel file .aspx nel nostro caso la pagina l’ho chiamata wf_upload_file.aspx che contiene il codice :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<%@ Page language="c#" Debug="true" Codebehind="wf_upload_file.pas" AutoEventWireup="false" Inherits="wf_upload_file.Twf_upload_file" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title></title> <meta name="GENERATOR" content="Borland Package Library 7.1"> </head> <body ms_positioning="GridLayout"> <form id=Form1 method=post enctype="multipart/form-data" runat="server"> <input id=MyFile type=file runat="server"><br /> <input type=submit value="Invia query"> <asp:textbox id=TextBox1 style="Z-INDEX: 1; LEFT: 14px; POSITION: absolute; TOP: 86px" runat="server" height="93" width="691px" textmode="MultiLine"> </asp:textbox> <asp:image id=Image1 style="Z-INDEX: 2; LEFT: 118px; POSITION: absolute; TOP: 214px" runat="server" height="211px" width="243px"> </asp:image> </form> </body> </html> |
La riga di ns interesse è :
1 |
"<input id=MyFile type=file runat="server">" |
dove l’interprete .Net crea un oggetto il cui nome è “MyFile” questo oggetto fa parte della classe : System.Web.UI.HtmlControls.HtmlInputFile.
La parte di “code behind” il file wf_upload_file.pas :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
unit wf_upload_file; interface uses System.Collections, System.ComponentModel, System.Data, System.Drawing, System.Web, System.Web.SessionState, System.Web.UI, System.Web.UI.WebControls, System.Web.UI.HtmlControls; type Twf_upload_file = class(System.Web.UI.Page) {$REGION 'Designer Managed Code'} strict private procedure InitializeComponent; {$ENDREGION} strict private procedure Page_Load(sender: System.Object; e: System.EventArgs); strict protected TextBox1: System.Web.UI.WebControls.TextBox; MyFile : System.Web.UI.HtmlControls.HtmlInputFile; Image1: System.Web.UI.WebControls.Image; procedure OnInit(e: EventArgs); override; private public { Public Declarations } end; implementation uses borland.vcl.sysutils; {$REGION 'Designer Managed Code'} /// <summary> /// Required method for Designer support -- do not modify /// the contents of this method with the code editor. /// </summary> procedure Twf_upload_file.InitializeComponent; begin Include(Self.Load, Self.Page_Load); end; {$ENDREGION} procedure Twf_upload_file.Page_Load(sender: System.Object; e: System.EventArgs); begin // TODO: Put user code to initialize the page here If filMyFile.PostedFile <> nil then Begin TextBox1.Text := ' non nullo '; TextBox1.Text := TextBox1.Text + MyFile.PostedFile.FileName + #10#13; TextBox1.Text := TextBox1.Text + 'dimensione : ' + Int64(filMyFile.PostedFile.ContentLength).ToString + #10#13; filMyFile.PostedFile.SaveAs('C:\Inetpub\wwwroot\mio_progetto\up_img\' + ExtractFileName(filMyFile.PostedFile.FileName)); Image1.ImageUrl := 'up_img/' + ExtractFileName(MyFile.PostedFile.FileName); End Else Begin End; end; procedure Twf_upload_file.OnInit(e: EventArgs); begin // // Required for Designer support // InitializeComponent; inherited OnInit(e); end; end. |
Da notare l’obbligatorietà della dichiarazione dell’oggetto MyFile all’interno della classe che definisce la pagina, che non avviene in automatico, anche se dovrebbe delphi 8.0 riconoscere tutti gli oggetti definiti nella pagina .aspx e mantenerne l’allineamento con il .pas. Nell’evento Page_Load viene implementato il codice per salvare il file inviato dall’utente in una posizione del disco.
Ho aggiunto l’uso della libreria uses borland.vcl.sysutils; s per poter accedere alla funzione ExtractFileName della vcl semplicemente perchè non conosco la funzione che esegue le stesse cose nel .Net framework.
Spero che l’articolo sia comprensibile, l’ho effettivamente scritto un po di fretta.
Ciao a tutti
Ivan ….