2009-09-15 45 views
0

從我的崗位繼..把圖像和變量在HTTP POST(不使用FileUpload控件)

Saving an image from HTTP POST (Not using FileUpload Control)。當我有種來到了假設,我可以只使用Request.Files ..

要測試的節能功能,我現在在看在動態起草這個HTTP發送後通過一個HTTP POST圖像後面的代碼和不使用FileUpload控件

它在這裏被觸摸..

Send a file via HTTP POST with C#

但是,我在找的是確保其他POST變量保持了較完整的樣本和一個。

其實這一次也許幫助..

Multipart forms from C# client

UPDATE: 對不起..問題是..

如何通過HTTP POST發送圖像到URL(沒有文件上傳控制)以及其他POST變量,並讓Request.Files在目標網址中選擇它?

SOLUTION

最後我解決它使用WebHelpers類這裏

Multipart forms from C# client

+1

問題是什麼? – 2009-09-15 08:26:38

回答

1

我用下面的代碼段:

用法

List<IPostDataField> Fields = new List<IPostDataField>(); 
Fields.Add(new PostDataField() { Name="nameOfTheField", Value="value" }); //simple field 
Fields.Add(new PostDataFile() { Name="nameOfTheField", FileName="something.ext", Content = byte[], Type = "mimetype" }); 

string response = WebrequestManager.PostMultipartRequest(
    new PostDataEntities.PostData() 
    { 
     Fields = Fields 
    } 
    , 
      "url"); 

PostMultiPartRequest

public static string PostMultipartRequest(PostData postData, string relativeUrl, IUserCredential userCredential) 
    { 
     string returnXmlString = ""; 

     try 
     { 
      //Initialisatie request 
      WebRequest webRequest = HttpWebRequest.Create(string.Format(Settings.Default.Api_baseurl, relativeUrl)); 
      //Credentials 
      NetworkCredential apiCredentials = userCredential.NetworkCredentials; 
      webRequest.Credentials = apiCredentials; 
      webRequest.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(apiCredentials.UserName + ":" + apiCredentials.Password))); 
      //Post! 
      webRequest.Method = "POST"; 
      webRequest.ContentType = "multipart/form-data; boundary="; 

      //Post 
      //byte[] bytesToWrite = UTF8Encoding.UTF8.GetBytes(multipartData); 
      string boundary = ""; 
      byte[] data = postData.Export(out boundary); 
      webRequest.ContentType += boundary; 
      webRequest.ContentLength = data.Length; 
      using (Stream xmlStream = webRequest.GetRequestStream()) 
      { 
       xmlStream.Write(data, 0, data.Length); 
      } 

      //webRequest.ContentType = "application/x-www-form-urlencoded"; 
      using (WebResponse response = webRequest.GetResponse()) 
      { 
       // Display the status 
       // requestStatus = ((HttpWebResponse)response).StatusDescription; 

       //Plaats 'response' in stream 
       using (Stream xmlResponseStream = response.GetResponseStream()) 
       { 
        //Gebruik streamreader om stream uit te lezen en om te zetten naar string 
        using (StreamReader reader = new StreamReader(xmlResponseStream)) 
        { 
         returnXmlString = reader.ReadToEnd(); 
        } 
       } 
      } 
     } 
     catch (WebException wexc) 
     { 
      switch (wexc.Status) 
      { 
       case WebExceptionStatus.Success: 
       case WebExceptionStatus.ProtocolError: 
        log.Debug("bla", wexc); 
        break; 
       default: 
        log.Warn("bla", wexc); 
        break; 
      } 
     } 
     catch (Exception exc) 
     { 
      log.Error("bla"); 
     } 

     return returnXmlString; 

    } 

IPostdataField

public interface IPostDataField 
{ 
    byte[] Export(); 
} 

PostDataField

public class PostDataField : IPostDataField 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 

    #region IPostDataField Members 

    public byte[] Export() 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      StreamWriter sw = new StreamWriter(stream); 
      { 
       StringBuilder sb = new StringBuilder(); 
       sb.AppendLine(string.Format("Content-Disposition: form-data; name=\"{0}\"", Name)); 
       sb.AppendLine(); 
       sb.AppendLine(Value); 
       sw.Write(sb.ToString()); 
       sw.Flush(); 
      } 

      stream.Position = 0; 

      byte[] buffer = new byte[stream.Length]; 
      stream.Read(buffer, 0, (int)buffer.Length); 
      return buffer; 
     } 
    } 

    #endregion 
} 

PostDataFile

public class PostDataFile : IPostDataField 
{ 
    public Byte[] Content { get; set; } 
    public string Name { get; set; } 
    public string FileName { get; set; } 
    public string Type { get; set; } // mime type 

    public byte[] Export() 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      StreamWriter sw = new StreamWriter(stream); 

      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"", Name, FileName)); 
      sb.AppendLine("Content-Type: " + Type); 
      sb.AppendLine(); 

      sw.Write(sb.ToString()); 

      sw.Flush(); 

      stream.Write(Content, 0, Content.Length); 

      stream.Position = 0; 

      byte[] buffer = new byte[stream.Length]; 
      stream.Read(buffer, 0, (int)buffer.Length); 
      return buffer; 
     } 
    } 
} 

POSTDATA

public class PostData 
{ 
    public PostData() { Fields = new List<IPostDataField>(); } 

    public List<IPostDataField> Fields { get; set; } 

    public Byte[] Export(out string boundary) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      Random r = new Random(); 
      string tok = ""; 
      for (int i = 0; i < 14; i++) 
       tok += r.Next(10).ToString(); 

      boundary = "---------------------------" + tok; 
      using (StreamWriter sw = new StreamWriter(stream)) 
      { 
       //sw.WriteLine(string.Format("Content-Type: multipart/form-data; boundary=" + boundary.Replace("--", ""))); 
       //sw.WriteLine(); 
       //sw.Flush(); 

       foreach (IPostDataField field in Fields) 
       { 
        sw.WriteLine("--" + boundary); 
        sw.Flush(); 

        stream.Write(field.Export(), 0, (int)field.Export().Length); 
       } 

       //1 keer om het af te leren 
       //sw.WriteLine(); 
       sw.WriteLine("--" + boundary + "--"); 
       sw.Flush(); 

       stream.Position = 0; 

       using (StreamReader sr = new StreamReader(stream)) 
       { 
        string bla = sr.ReadToEnd(); 

        stream.Position = 0; 
        Byte[] toExport = new Byte[stream.Length]; 
        stream.Read(toExport, 0, (int)stream.Length); 
        return toExport; 
       } 

      } 
     } 
    } 
} 
+0

乾杯1月,我要試試你的建議。 - 李 – 2009-09-15 08:34:22

0

對於任何絆在這個問題,更現代的方法中,使用.NET 4.5(或通過添加從所述的NuGet包Microsoft.Net.Http .NET 4.0),是使用Microsoft.Net.Http。這裏是一個例子:

private System.IO.Stream Upload(string actionUrl, string paramString, Stream paramFileStream, byte [] paramFileBytes) 
{ 
    HttpContent stringContent = new StringContent(paramString); 
    HttpContent fileStreamContent = new StreamContent(paramFileStream); 
    HttpContent bytesContent = new ByteArrayContent(paramFileBytes); 
    using (var client = new HttpClient()) 
    using (var formData = new MultipartFormDataContent()) 
    { 
     formData.Add(stringContent, "param1", "param1"); 
     formData.Add(fileStreamContent, "file1", "file1"); 
     formData.Add(bytesContent, "file2", "file2"); 
     var response = client.PostAsync(actionUrl, formData).Result; 
     if (!response.IsSuccessStatusCode) 
     { 
      return null; 
     } 
     return response.Content.ReadAsStreamAsync().Result; 
    } 
}