.net ile web sayfasına dosya yükleme

c# logo

Windows masaüstü uygulamasından bir web sayfasının kaynak kodunu almak oldukça kolay.  Bir webclient oluşturup kaynak kodunu çekebilirsiniz. Fakat .net ile web sayfasına dosya yükleme (httppost) olayı bundan bir tık ötesini gerektiriyor.Windows forms, wpf ya da console uygulamanızdan bir web sayfasına post etme işlemi için aşağıdaki fonksiyonu kullanabilirsiniz.

Parametreler:

url: Post edilecek web adresi (http ile),
file : gönderilecek dosya yolu (mappath ile),
paramName : gönderilecek dosyanın input adı (html input type=”file” name=”paramName” )
contentType: gönderilecek içerik tipi, text/plain, text/xml gibi,
nvc: post edilen dosya yanında parametre gönderilecekse post adı & değeri ikilileri bir namevaluecollection içerisinde gönderilir.

Oldukça basit, uzun sürecek işlemleriniz için async fonksiyon olarak tanımlayabilirsiniz.

Karşı sitenin dosya yüklemeye hazır olduğundan emin olmalısınız.

 public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc)
        {
          
            string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
            wr.ContentType = "multipart/form-data; boundary=" + boundary;
            wr.Method = "POST";
            wr.KeepAlive = true;
            wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

            Stream rs = wr.GetRequestStream();

            string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
            foreach (string key in nvc.Keys)
            {
                rs.Write(boundarybytes, 0, boundarybytes.Length);
                string formitem = string.Format(formdataTemplate, key, nvc[key]);
                byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                rs.Write(formitembytes, 0, formitembytes.Length);
            }
            rs.Write(boundarybytes, 0, boundarybytes.Length);

            string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            string header = string.Format(headerTemplate, paramName, file, contentType);
            byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            rs.Write(headerbytes, 0, headerbytes.Length);

            FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[4096];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                rs.Write(buffer, 0, bytesRead);
            }
            fileStream.Close();

            byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            rs.Write(trailer, 0, trailer.Length);
            rs.Close();

            WebResponse wresp = null;
            try
            {
                wresp = wr.GetResponse();
                Stream stream2 = wresp.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                
            }
            catch (Exception ex)
            {
                
                if (wresp != null)
                {
                    wresp.Close();
                    wresp = null;
                }
            }
            finally
            {
                wr = null;
            }
        }

İyi çalışmalar.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir