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

  • BiGSH0TROB

    BiGSH0TROB

    7 NİSAN 2011
  • lane182videos

    lane182video

    6 EKİM 2011
  • Photoshop Pro Help

    Photoshop Pr

    1 Ocak 2007