2011-04-19 92 views
0
public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc) 
    { 
     Console.WriteLine(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); 
      Console.WriteLine(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd())); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Error uploading file", ex.Message); 
      if (wresp != null) 
      { 
       wresp.Close(); 
       wresp = null; 
      } 
     } 
     finally 
     { 
      wr = null; 
     } 
    } 

    static void Main(string[] args) 
    { 
     String token = args[0]; 

     NameValueCollection nvc = new NameValueCollection(); 
     nvc.Add("token", token); 
     nvc.Add("name", "mms-deneme"); 
     nvc.Add("frame_count", "1"); 
     nvc.Add("frame_1_text", "1. resim text"); 
     nvc.Add("frame_1_duration", "15"); 
     HttpUploadFile("https://api.turkcell.hedeflimesaj.com/mms.json", 
      @"C:\test\test.jpg", "frame_1_visual", "image/jpeg", nvc); 

    } 
} 

}此代碼是簡單的文件upload.How上傳多文件,使用此way.thx

回答

1

您可以檢出following blog post我在這個問題上寫道。


UPDATE:

發佈源代碼的鏈接OP沒有工作:

你曾經在一個情況下,你需要將多個文件上傳到遠程主機並在請求中傳遞其他參數?不幸的是,BCL中沒有任何東西可以讓我們實現這一切。

我們有UploadFile方法,但它僅限於單個文件,並且不允許我們傳遞任何附加參數。所以讓我們繼續寫下這樣的方法。重要的是該方法必須符合RFC 1867,以便遠程Web服務器可以成功解析信息。

首先,我們定義要上傳代表單個文件的模型:

public class UploadFile 
{ 
    public UploadFile() 
    { 
     ContentType = "application/octet-stream"; 
    } 
    public string Name { get; set; } 
    public string Filename { get; set; } 
    public string ContentType { get; set; } 
    public Stream Stream { get; set; } 
} 

這裏是一個示例UploadFiles方法實現:

public byte[] UploadFiles(string address, IEnumerable<UploadFile> files, NameValueCollection values) 
{ 
    var request = WebRequest.Create(address); 
    request.Method = "POST"; 
    var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo); 
    request.ContentType = "multipart/form-data; boundary=" + boundary; 
    boundary = "--" + boundary; 

    using (var requestStream = request.GetRequestStream()) 
    { 
     // Write the values 
     foreach (string name in values.Keys) 
     { 
      var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine); 
      requestStream.Write(buffer, 0, buffer.Length); 
      buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine)); 
      requestStream.Write(buffer, 0, buffer.Length); 
      buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine); 
      requestStream.Write(buffer, 0, buffer.Length); 
     } 

     // Write the files 
     foreach (var file in files) 
     { 
      var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine); 
      requestStream.Write(buffer, 0, buffer.Length); 
      buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine)); 
      requestStream.Write(buffer, 0, buffer.Length); 
      buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", file.ContentType, Environment.NewLine)); 
      requestStream.Write(buffer, 0, buffer.Length); 
      file.Stream.CopyTo(requestStream); 
      buffer = Encoding.ASCII.GetBytes(Environment.NewLine); 
      requestStream.Write(buffer, 0, buffer.Length); 
     } 

     var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--"); 
     requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length); 
    } 

    using (var response = request.GetResponse()) 
    using (var responseStream = response.GetResponseStream()) 
    using (var stream = new MemoryStream()) 
    { 
     responseStream.CopyTo(stream); 
     return stream.ToArray(); 
    } 
} 

下面是一個示例用法:

using (var stream1 = File.Open("test.txt", FileMode.Open)) 
using (var stream2 = File.Open("test.xml", FileMode.Open)) 
using (var stream3 = File.Open("test.pdf", FileMode.Open)) 
{ 
    var files = new[] 
    { 
     new UploadFile 
     { 
      Name = "file", 
      Filename = "test.txt", 
      ContentType = "text/plain", 
      Stream = stream1 
     }, 
     new UploadFile 
     { 
      Name = "file", 
      Filename = "test.xml", 
      ContentType = "text/xml", 
      Stream = stream2 
     }, 
     new UploadFile 
     { 
      Name = "file", 
      Filename = "test.pdf", 
      ContentType = "application/pdf", 
      Stream = stream3 
     } 
    }; 

    var values = new NameValueCollection 
    { 
     { "key1", "value1" }, 
     { "key2", "value2" }, 
     { "key3", "value3" }, 
    }; 

    byte[] result = UploadFiles("http://localhost:1234/upload", files, values); 
} 

在這個例子中,我們將3個值和3個文件上傳到遠程主機。

+0

鏈接不起作用 – Mennano 2011-04-19 09:41:52

+0

@ user714869,我已經包含博客文章的源代碼。請參閱我的更新。 – 2011-04-19 09:55:17

+0

它會不會更好地使用服務器和網絡多次使用System.WebClient.UploadFileAsync(...)? – Adrian 2011-04-19 09:59:30