SORU
19 ŞUBAT 2009, PERŞEMBE


Upload HTTPWebrequest (parçalı/-veri formu)ile dosyaları

Orada benimle dosya yüklemek için yardımcı olacak herhangi bir sınıf, kütüphane veya kod parçasıHTTPWebrequest?

Edit 2:

Bir WebDAV klasörüne falan yüklemek istemiyorum. Bir tarayıcı taklit, avatar yükleme gibi bir forum veya bir web uygulamasında form üzerinden bir dosya upload etmek istiyorum. Çok parçalı/kullanan bir form yüklemek için veri formu.

Düzenleme:

Professional (Service benim gereksinimlerini karşılamak değil, bir çözüm arıyorumHTTPWebrequest.

CEVAP
8 HAZİRAN 2010, Salı


Yukarıdaki kodu alıp İç Sunucu atar çünkü Sabit Hata 500. \R\n kötü yerleştirilmiş olan bazı sorunlar ve benzeri alanlarda var. Bellek akışı ile yeniden düzenleme, talebi doğrudan stream yazma uygulamalı. İşte sonuç:

    public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc) {
        log.Debug(string.Format("Uploading {0} to {1}", file, url));
        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);
            log.Debug(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd()));
        } catch(Exception ex) {
            log.Error("Error uploading file", ex);
            if(wresp != null) {
                wresp.Close();
                wresp = null;
            }
        } finally {
            wr = null;
        }
    }

ve örnek kullanım:

    NameValueCollection nvc = new NameValueCollection();
    nvc.Add("id", "TTR");
    nvc.Add("btn-submit-photo", "Upload");
    HttpUploadFile("http://your.server.com/upload", 
         @"C:\test\test.jpg", "file", "image/jpeg", nvc);

Birden fazla dosya işlemek ya da sadece her dosya için birden çok kez aramak için genişletilmiş olabilir. Ancak bu sizin ihtiyaçlarınıza uygun.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Tedeyev

    David Tedeye

    20 AĞUSTOS 2011
  • FrameCityJackal

    FrameCityJac

    4 Aralık 2010
  • Myron and Nejusha dance

    Myron and Ne

    2 AĞUSTOS 2012