Friday, July 31, 2009

Writing and Reading to a Text File.

Writing and Reading to a Text File:


Description:


When developers have large data in text box then it is not possible to insert into a database table.
So you can use the below code to write to a text and save file path in the database. So to read
a file use the below code by passing the file path.



Design View:




Code Behind:



//.....Below Method is for writing data from a textbox to a text file.


protected void WritingToTextFile()
{

//.....Generating a file name.

string concatstring = DateTime.Now.ToString("ddMMyyyy")+" "+DateTime.Now.Hour.ToString()+""+DateTime.Now.Minute.ToString()+""+DateTime.Now.Second.ToString()+""+DateTime.Now.Millisecond.ToString();
string fname = concatstring+".txt";
string filename = "D:\\"+concatstring+".txt";

//.....FileInfo class is for creating file.

FileInfo fnew = new FileInfo(filename);

//.....StreamWriter class is for writing text to the text file.

StreamWriter sw = fnew.CreateText();
sw.WriteLine(txtTemplate.Text);
sw.Close();
}

protected void ReadingTextFile(string sFileName)
{
string sframedata = "";
string datas = "";

//.....StreamReader class is for Reading text from the text file.

StreamReader sr = new StreamReader("D:\\"+sFileName);
while((datas = sr.ReadLine()) != null)
{
sframedata += datas;
}
txtTemplate.Text = sframedata.ToString();
}

Regard

Prateek

Xml File Read and Bind

XML File like this


< NewDataSet >
< Table >
< Country > British Indian Ocean Territory< /Country >
< City > Diego Garcia< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Ahmadabad< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Akola< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Aurangabad Chikalthan Aerodrome< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Bombay / Santacruz< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Bilaspur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Bhuj-Rudramata< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Belgaum / Sambra< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Bhopal / Bairagarh< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Bhaunagar< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Goa / Dabolim Airport< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Indore< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Jabalpur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Khandwa< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Kolhapur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Nagpur Sonegaon< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Rajkot< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Sholapur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Agartala< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Siliguri< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Bhubaneswar< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Calcutta / Dum Dum< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Car Nicobar< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Gorakhpur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Gauhati< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Gaya< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Imphal Tulihal< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Jharsuguda< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Jamshedpur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > North Lakhimpur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Dibrugarh / Mohanbari< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Port Blair< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Patna< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > M. O. Ranchi< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Agra< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Allahabad / Bamhrauli< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Amritsar< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Varanasi / Babatpur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Bareilly< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Kanpur / Chakeri< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > New Delhi / Safdarjung< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > New Delhi / Palam< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Gwalior< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Hissar< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Jhansi< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Jodhpur< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Jaipur / Sanganer< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Kota Aerodrome< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Lucknow / Amausi< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Satna< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Udaipur Dabok< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Bellary< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Vijayawada / Gannavaram< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Coimbatore / Peelamedu< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Cochin / Willingdon< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Cuddapah< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Hyderabad Airport< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Madurai< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Mangalore / Bajpe< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Madras / Minambakkam< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Tiruchchirapalli< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Thiruvananthapuram< /City >
< /Table >
< Table >
< Country > India< /Country >
< City > Vellore< /City >
< /Table >
< /NewDataSet >


client Side Code



< html xmlns="http://www.w3.org/1999/xhtml" >
< head runat="server" >
< title >Untitled Page< /title >
< /head >
< body >
< form id="form1" runat="server" >
< div >
< asp:DataGrid ID="dtg1" runat ="Server" AutoGenerateColumns ="false" >
< Columns >
< asp:TemplateColumn HeaderText ="Country" >
< ItemTemplate >
< asp:Label ID="lbl1" runat ="server" Text ='< %# Bind("Country") % >' >< /asp:Label >
< /ItemTemplate >
< /asp:TemplateColumn >


< asp:TemplateColumn HeaderText ="City" >
< ItemTemplate >
< asp:Label ID="lbl2" runat ="server" Text ='< %# Bind("City") % >' >< /asp:Label >
< /ItemTemplate >
< /asp:TemplateColumn >
< /Columns >
< /asp:DataGrid >

< /div >
< /form >
< /body >
< /html >


Server Side


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
cls1 = New ClsConnect
ds.ReadXml(Server.MapPath("XMLFile.xml"))
dtg1.DataSource = ds
dtg1.DataBind()
End Sub


Regard

Prateek

Thursday, July 30, 2009

Silverlight DataGrid Paging

Silverlight DataGrid does not have the built-in paging facility. So here is a small piece of code to implement paging in Silverlight DataGrid. For this custom paging
Calculate the number of pages based on total number of records and page size
Add those many buttons to a container like StackPanel and
On those buttons click events bind the DataGrid to desired range of records.



1.Define the following Properties and Variables
public partial class Page : UserControl

{

//Property to hold the value of total records

public int TotalRow { get; set; }

//Property to hold the value of page size

public int PageSize { get; set; }

//Number of rows that the DataGrid

int totalRowsInGrid = 0;

2. Initialize the values public Page()

{

InitializeComponent();

//Initialize the page size

PageSize = 10;

//Get the desired data

user = User.Get();

//Set the TotalRow cout to the number of rows returned for data

TotalRow = user.Count;



BindGrid(1);

DoPaging(this.PageSize, TotalRow);

}

3. Create a method to get the desired range of data based on page number///

/// Returns paged data based on page number

///


///

///

private List GetData(int pageNumber)

{

int Pagestart = (pageNumber - 1) * this.PageSize;

TextBlockStartPageNumber.Text = (Pagestart+1).ToString();

TextBlockEndPageNumber.Text = (Pagestart + totalRowsInGrid).ToString();

TextBlockTotalRecords.Text = TotalRow.ToString();

int i = TotalRow;

List PagedData;

//List PagedData = user.Skip((pageNumber - 1) * PageSize).Take(PageSize) as List;

//List PageedData = FullList.Skip((PageNumber - 1) * PageSize).Take(PageSize).ToList();

if ((i - ((pageNumber - 1) * this.PageSize)) >= this.PageSize)

PagedData = user.GetRange(Pagestart, this.PageSize);

else

PagedData = user.GetRange(Pagestart, (i % this.PageSize));

return PagedData;

}

4. Bind the DataGrid///

/// Bind grid to the desired range of records

///


///

private void BindGrid(int PageNumber)

{

if (this.PageSize * PageNumber > this.TotalRow)

{

totalRowsInGrid = this.TotalRow % this.PageSize;

}

else

{

totalRowsInGrid = this.PageSize;

}

dataGridPaging.ItemsSource = GetData(PageNumber);

}

5. Write the click event for the paging buttons///

/// Handles the click event of buttons having page numbers

///


///

///

void btn_Click(object sender, RoutedEventArgs e)

{

Button btn = sender as Button;

int iPageNumber = Convert.ToInt32(btn.Content.ToString());

BindGrid(iPageNumber);

}

Regard

Prateek

Wednesday, July 29, 2009

How Google Works

How Google Works

Google runs on a distributed network of thousands of low-cost computers and can therefore carry out fast parallel processing. Parallel processing is a method of computation in which many calculations can be performed simultaneously, significantly speeding up data processing. Google has three distinct parts:


• Googlebot, a web crawler that finds and fetches web pages.
• The indexer that sorts every word on every page and stores the resulting index of words in a huge database.
• The query processor, which compares your search query to the index and recommends the documents that it considers most relevant.

Let’s take a closer look at each part.
1. Googlebot, Google’s Web Crawler

Googlebot is Google’s web crawling robot, which finds and retrieves pages on the web and hands them off to the Google indexer. It’s easy to imagine Googlebot as a little spider scurrying across the strands of cyberspace, but in reality Googlebot doesn’t traverse the web at all. It functions much like your web browser, by sending a request to a web server for a web page, downloading the entire page, and then handing it off to Google’s indexer.

Googlebot consists of many computers requesting and fetching pages much more quickly than you can with your web browser. In fact, Googlebot can request thousands of different pages simultaneously. To avoid overwhelming web servers, or crowding out requests from human users, Googlebot deliberately makes requests of each individual web server more slowly than it’s capable of doing.

Googlebot finds pages in two ways: through an add URL form, www.google.com/addurl.html, and through finding links by crawling the web.



2. Google’s Indexer

Googlebot gives the indexer the full text of the pages it finds. These pages are stored in Google’s index database. This index is sorted alphabetically by search term, with each index entry storing a list of documents in which the term appears and the location within the text where it occurs. This data structure allows rapid access to documents that contain user query terms.

To improve search performance, Google ignores (doesn’t index) common words called stop words (such as the, is, on, or, of, how, why, as well as certain single digits and single letters). Stop words are so common that they do little to narrow a search, and therefore they can safely be discarded. The indexer also ignores some punctuation and multiple spaces, as well as converting all letters to lowercase, to improve Google’s performance.


3. Google’s Query Processor


The query processor has several parts, including the user interface (search box), the “engine” that evaluates queries and matches them to relevant documents, and the results formatter.

Page Rank is Google’s system for ranking web pages. A page with a higher Page Rank is deemed more important and is more likely to be listed above a page with a lower Page Rank.


I hope you like this article.


Regards,

Prateek

About AJAX

About AJAX

• AJAX stands for Asynchronous JavaScript and XML.
• AJAX is become popular with Google application like Google suggestion

AJAX Components

• HTML
• CSS
• DOM
• JavaScript
• XML
• JSon
• XMLHttp

AJAX Framework

• Built on top of ASP.NET 2.0, there is a valuable set of controls and services that extend the existing framework with Ajax support.
• This tier of the server framework is called the ASP.NET AJAX Server Extensions.
• The server extensions are broken up into three areas: server controls, Web Services Bridge and the Application Services Bridge.
• Each of these components interacts closely with the application model on the client to improve the interactivity of existing ASP.NET pages.

ASP.NET AJAX Server Controls

The new set of server controls add to the already impressive arsenal of tools in the ASP.NET toolbox and are predominantly driven by two main controls.

ScriptManager - is considered to be the brains of an Ajax-enabled page. One of the many responsibilities of the ScriptManager isorchestrating the regions on the page that are dynamically updated during asynchronous postbacks.

UpdatePanel - is used to define the regions on the page that are designated for partial updates.

Getting the IP address

Well, yes, it looks like trivial but it isn't. Many a times we need to get the IP address of the user. There are a handful of suggestions to do this. I discuss the methods and the short comings in them.

1. REMOTE_ADDR


string ipAddress = Request.ServerVariables["REMOTE_ADDR"];

This method fails when the user's request travels through a Proxy server. The Ip address in this case will be of the proxy.

2. HTTP_X_FORWARDED_FOR


string ipAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

Generally method 1 is overcome by using HTTP_X_FORWARDED_FOR server variable. This method returns the user address. Well this method fails when the user request does not come through a proxy.

3. REMOTE_ADDR and HTTP_X_FORWARDED_FOR


string ipAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ipAddress))
ipAddress = Request.ServerVariables["REMOTE_ADDR"];

Using the combination of method 1 and 2 we come to method 3. Do you think this is the solution? No. This ain't too. The reason being, sometimes the requests passes through multiple Proxy servers. In this case HTTP_X_FORWARDED_FOR contains comma separated values of the various proxy servers through which the request passes. So you actually do not have one IP address but multiple ones.

4. REMOTE_ADDR and HTTP_X_FORWARDED_FOR and some processing


string ipAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ipAddress))
ipAddress = Request.ServerVariables["REMOTE_ADDR"];

int index = -1;
if ((index = ipAddress.IndexOf(",")) > -1)
{
ipAddress = ipAddress.Substring(0, index);
}

The final solution we come to is, use method 3 but check if there is comma separated values. If there is then we take the first IP address which will be the IP address of the user.

I have formatted this into a method which can be reused,



public static class Utility
{
public static string GetIP(NameValueCollection nameValueCollection)
{
string result = string.Empty;

if (nameValueCollection == null || nameValueCollection.Count < 1)
return result;

result = nameValueCollection["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(result))
return nameValueCollection["REMOTE_ADDR"];

int index = -1;
if ((index = result.IndexOf(",")) > -1)
{
result = result.Substring(0, index);
}

return result;
}
}

Request.ServerVariables is a NameValueCollection. To use the above method you will have to pass in Request.ServerVariables as a parameter. Like this,


string ipAddress = Utility.GetIP(Request.ServerVariables);


An important inclusion is that this method works for Transparent proxies. There is no way (what I know) to detect the real IP address of a user for a Anonymous/Distorting Proxy.

Sunday, July 26, 2009

Google Dance

Google Dance
The name Google Dance is a term used to describe the index update of the Google search engine. It's the period when Google is rebuilding its rankings, and results fluctuate widely for a 3 to 5 day period. It can be identified by significant movement in search results and especially by Google's cache of all indexed pages reflecting the status of Google's last spidering.

Approximately once a month, Google update their index by recalculating the Page ranks of each of the web pages that they have crawled. The period during the update is known as the Google dance.

Because of the nature of Page Rank, the calculations need to be performed about 40 times and, because the index is so large, the calculations take several days to complete. During this period, the search results fluctuate; sometimes minute-by minute. It is because of these fluctuations that the term, Google Dance, was coined. The dance usually takes place sometime during the last third of each month.

Google has two other servers that can be used for searching. The search results on them also change during the monthly update and they are part of the Google dance.

Checking the Google Dance

Until January 2004, Google had 12 main www servers online, which were as follows:

www-ex.google.com - (where you get when you type www.google.com)
www-sj.google.com - (which can also be accessed at www2.google.com)
www-va.google.com - (which can also be accessed at www3.google.com)
www-dc.google.com
www-ab.google.com
www-in.google.com
www-zu.google.com
www-cw.google.com
www-fi.google.com - found in May 2003.
www-gv.google.com - found in August 2003.
www-gv2.google.com - found in September 2003.
www-kr.google.com - found in October 2003.

At some point in January, these servers stopped accepting connections, and the only servers easy to connect to be:

www.google.com
www2.google.com
www3.google.com

Saturday, July 25, 2009

Export data in excel from gridview

Here is the comple code to generate data in excel from gridview....


protected void Button1_Click(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/ms-excel";
Response.AddHeader("content-disposition", string.Format("file.xls", "excelsheet"));

System.IO.StringWriter stringwriter = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(stringwriter);
GridView1.RenderControl(hw);
Response.Write(stringwriter.ToString());
Response.End();

}

Friday, July 24, 2009

Creating Add to Favorites link through JavaScript

JavaScript function code:
function addfav()
{
if (document.all)
{
window.external.AddFavorite
("http://www.bprateek.blogspot.com","Prateek Tips")
}
}

from the link as:
Add To Favorites

State Management using Querystring

//send data as querystring Response.Redirect("http://localhost:3521/Basic/StateManagement/Stateinfo.aspx?name=sysmphony-services&lang=en-US");
//Querystring information
Label1.Text = "Query string output:Name: " + Server.HtmlEncode(Request.QueryString["name"]) +
", Lang: " + Server.HtmlEncode(Request.QueryString["lang"]);

State Management using Session

/Store session information
Session["Name"] = "Symphony Services: ";
Session["MobileNo"] = "9765543639";
//Get session information in any page
//Accessing session info
lblSession.Text = Session["Name"].ToString() + Session["MobileNo"].ToString();

State Management using cookies

// Check if cookie exists, and display it if it does
if (Request.Cookies["lastVisit"] != null)
// Encode the cookie in case the cookie contains client-side script
Label1.Text = Server.HtmlEncode(Request.Cookies["lastVisit"].Value);
else Label1.Text = "No value defined";
// Define the cookie for the next visit
Response.Cookies["lastVisit"].Value = DateTime.Now.ToString();
Response.Cookies["lastVisit"].Expires = DateTime.Now.AddDays(1);

Wednesday, July 22, 2009

Download files

private void DownloadFile( string fname)
{
try
{
string path = MapPath( fname );
string name = System.IO.Path.GetFileName( path );
string ext = System.IO.Path.GetExtension( path );
string type = "";
// set known types based on file extension
if ( ext != null )
{
switch( ext.ToLower() )
{
case ".htm":
case ".html":
type = "text/HTML";
break;

case ".txt":
type = "text/plain";
break;

case ".doc":
case ".rtf":
type = "Application/msword";
break;
case ".xml":
type = "Application/xml";
break;
case ".zip":
type = "application/zip";
break;
}
}

Response.AppendHeader( "content-disposition","attachment; filename=" + name );
if ( type != "" )
Response.ContentType = type;
Response.WriteFile( path );
}
catch(Exception ex)
{
new PowerXEditor.BL.CommonUtility().RegisterError(ex);
}
Response.End();
}

Tuesday, July 21, 2009

String Manipulation in .Net

To remove specified number of characters from string:

If we want to remove some characters from a string we can remove using Remove function. It will have 2 parameters. First parameter is from where we need to remove and the second parameter is how many characters we need to remove. 2nd parameter is optional

Example:

It will remove 1 to 3 chars “ext” will be removed


string strremove = "Text to remove";
string stremovedtext = strremove.Remove(1, 3);
MessageBox.Show(stremovedtext);

To find a string with in a string:

To check whether a string is with in a string or not. We can use contains to check the speacified string is contains in another string.

Example:

Here we are searching “will” is contained in a text



//to find a text with in a text
string strfind="Text with in myself will be searched";
if (stremovedtext.Contains("will") == true)
{
MessageBox.Show("String found");
}
else
{
MessageBox.Show("String not found");
}

To check the beginning or end of a string

If we want to check the beginning or ending of a string. We can check it by using StartsWith or EndsWith.

Example

Here we want to check the string starts with “text” or ends with “text”



string strstartsorends="Text with in myself will be searched";
if ((strstartsorends.StartsWith("text")) || (strstartsorends.EndsWith("text")))
{
MessageBox.Show("It is started or ended with text");
}
else
{
MessageBox.Show("It is not started or ended with text");
}

Saturday, July 18, 2009

Send Email with Attachments in Asp.net 2.0 with C#.Net

we have to add following namespaces in our namespace area


Import System.Net
Import System.Net.Mail

Now the function below which i have written, you just pass the information in arguments and call that function to send email.


public static int SendEmail(string strFrom, string strTo, string strSubject, string strMsg)
{
try
{
// Object for mail
MailMessage objMailMsg = new MailMessage(strFrom, strTo);

objMailMsg.BodyEncoding = Encoding.UTF8;
objMailMsg.Subject = strSubject;
objMailMsg.Body = strMsg;
Attachment at = new Attachment(Server.MapPath("~/Files/TempFile.txt"));
objMailMsg.Attachments.Add(at);
objMailMsg.Priority = MailPriority.High;
objMailMsg.IsBodyHtml = true;

//Email send through SMTP Protocol
SmtpClient objSMTPClient = new SmtpClient();
objSMTPClient.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
objSMTPClient.Send(objMailMsg);
}
catch (Exception ex)
{
throw ex;
return 1;
}
finally
{
return 0;
}

}

if this function return 0 then email sent successfully with attachments
or is it return other than 0,then there might be some problems with server or attachments or Exception fired.

I hope this articles will be helpful for developers

Thanks

Friday, July 17, 2009

File Uploading in .NET

Hi,
Viewers ,
This is my first Post and I have started with .NET File uploading

1.
2. Sub Upload(Source As Object, e As EventArgs)
6.
7. If Not (myFile.PostedFile Is Nothing) Then
8.
9. Dim intFileNameLength as Integer
10. Dim strFileNamePath as String
11. Dim strFileNameOnly as String
12.
13. 'Logic to find the FileName (excluding the path)
14. strFileNamePath = MyFile.PostedFile.FileName
15. intFileNameLength = Instr(1, StrReverse(strFileNamePath), "\")
16. strFileNameOnly = Mid(strFileNamePath, (Len(strFileNamePath)-intFileNameLength)+2)
17.
18. 'myFile.PostedFile.SaveAs("c:\inetpub\wwwroot\yourwebapp\upload\" & strFileNameOnly)
19. myFile.PostedFile.SaveAs("d:\" & strFileNameOnly)
20. lblMsg.Text = "File Upload Success."
21.
22. End If
23. End Sub
24.
26.
27.
28.
29.

File Upload


30.
31.

32. File:
33.
34.
35.

36.
37.
38.