從C#提交多部分/表單數據內容類型的HTTP POST請求最簡單的方法是什麼?必須有比建立我自己的要求更好的方法。如何提交來自C#的多部分/表單數據HTTP POST請求?
我問的原因是使用此API將照片上傳到Flickr:
所有的http://www.flickr.com/services/api/upload.api.html
從C#提交多部分/表單數據內容類型的HTTP POST請求最簡單的方法是什麼?必須有比建立我自己的要求更好的方法。如何提交來自C#的多部分/表單數據HTTP POST請求?
我問的原因是使用此API將照片上傳到Flickr:
所有的http://www.flickr.com/services/api/upload.api.html
首先,這有什麼錯純手工執行使用.NET框架的HTTP命令。請記住它是一個框架,它應該是非常通用的。
其次,我想你可以嘗試在.Net中搜索瀏覽器實現。我看到了this one,或許它涵蓋了你問到的問題。或者您可以搜索「C# http put get post request」。其中一個結果導致一個非免費的庫,可能會有幫助(Chilkat http)
如果你碰巧在.net上編寫自己的HTTP命令框架 - 我想我們都可以享受它,如果你分享它:-)
不幸的是,這是我不得不做的。 – 2009-08-02 06:08:55
System.Net.WebClient類可能是你在找什麼。查看WebClient.UploadFile的文檔,它應該允許您通過UploadFile重載之一將文件上載到指定的資源。我認爲這是你正在尋找用來發布數據的方法...
它可以用來像....請注意,這不是測試只是示例代碼...
Web客戶端Web客戶端=新Web客戶端();
webClient.UploadFile(「http://www.url.com/ReceiveUploadedFile.aspx」,「POST」,@「c:\ myfile.txt」);
這裏是MSDN的參考,如果你有興趣。
http://msdn.microsoft.com/en-us/library/system.net.webclient.uploadfile.aspx
希望這有助於。
這會工作,如果我只是上傳文件。但是,我需要包含一堆其他表單變量。 – 2009-07-30 23:57:43
我已經成功發佈了代碼aspnetupload.com。我最終創建了自己的與Compact Framework兼容的UploadHelper庫。運作良好,似乎完全符合你的要求。
我應該添加「自己創建版本」==嘗試在Compact Framework項目中編譯庫,查看破壞的內容,使用另一個與CF兼容的對象或代碼段來做同樣的事情,重複一遍。我對這個過程的簡單程度感到驚喜。 – 2011-04-19 22:17:45
如果您使用的是.NET 4.5使用本:
public string Upload(string url, NameValueCollection requestParameters, MemoryStream file)
{
var client = new HttpClient();
var content = new MultipartFormDataContent();
content.Add(new StreamContent(file));
System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>> b = new List<KeyValuePair<string, string>>();
b.Add(requestParameters);
var addMe = new FormUrlEncodedContent(b);
content.Add(addMe);
var result = client.PostAsync(url, content);
return result.Result.ToString();
}
否則根據瑞安的答案,我下載了圖書館和調整它一下。
public class MimePart
{
NameValueCollection _headers = new NameValueCollection();
byte[] _header;
public NameValueCollection Headers
{
get { return _headers; }
}
public byte[] Header
{
get { return _header; }
}
public long GenerateHeaderFooterData(string boundary)
{
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(boundary);
sb.AppendLine();
foreach (string key in _headers.AllKeys)
{
sb.Append(key);
sb.Append(": ");
sb.AppendLine(_headers[key]);
}
sb.AppendLine();
_header = Encoding.UTF8.GetBytes(sb.ToString());
return _header.Length + Data.Length + 2;
}
public Stream Data { get; set; }
}
public string Upload(string url, NameValueCollection requestParameters, params MemoryStream[] files)
{
using (WebClient req = new WebClient())
{
List<MimePart> mimeParts = new List<MimePart>();
try
{
foreach (string key in requestParameters.AllKeys)
{
MimePart part = new MimePart();
part.Headers["Content-Disposition"] = "form-data; name=\"" + key + "\"";
part.Data = new MemoryStream(Encoding.UTF8.GetBytes(requestParameters[key]));
mimeParts.Add(part);
}
int nameIndex = 0;
foreach (MemoryStream file in files)
{
MimePart part = new MimePart();
string fieldName = "file" + nameIndex++;
part.Headers["Content-Disposition"] = "form-data; name=\"" + fieldName + "\"; filename=\"" + fieldName + "\"";
part.Headers["Content-Type"] = "application/octet-stream";
part.Data = file;
mimeParts.Add(part);
}
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
req.Headers.Add(HttpRequestHeader.ContentType, "multipart/form-data; boundary=" + boundary);
long contentLength = 0;
byte[] _footer = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");
foreach (MimePart part in mimeParts)
{
contentLength += part.GenerateHeaderFooterData(boundary);
}
//req.ContentLength = contentLength + _footer.Length;
byte[] buffer = new byte[8192];
byte[] afterFile = Encoding.UTF8.GetBytes("\r\n");
int read;
using (MemoryStream s = new MemoryStream())
{
foreach (MimePart part in mimeParts)
{
s.Write(part.Header, 0, part.Header.Length);
while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0)
s.Write(buffer, 0, read);
part.Data.Dispose();
s.Write(afterFile, 0, afterFile.Length);
}
s.Write(_footer, 0, _footer.Length);
byte[] responseBytes = req.UploadData(url, s.ToArray());
string responseString = Encoding.UTF8.GetString(responseBytes);
return responseString;
}
}
catch
{
foreach (MimePart part in mimeParts)
if (part.Data != null)
part.Data.Dispose();
throw;
}
}
}
我通常發現Fiddler是該工作的最佳工具。很容易創建請求,它甚至爲您生成一些標題。
我還沒有嘗試過這個自己,但似乎在C#這是一個內置的方式(雖然不是很知道一個很明顯...):
private static HttpClient _client = null;
private static void UploadDocument()
{
// Add test file
var httpContent = new MultipartFormDataContent();
var fileContent = new ByteArrayContent(File.ReadAllBytes(@"File.jpg"));
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "File.jpg"
};
httpContent.Add(fileContent);
string requestEndpoint = "api/Post";
var response = _client.PostAsync(requestEndpoint, httpContent).Result;
if (response.IsSuccessStatusCode)
{
// ...
}
else
{
// Check response.StatusCode, response.ReasonPhrase
}
}
試一試,讓我知道它是怎麼回事。
乾杯!
我主要一直在尋找HttpWebRequest,但我在互聯網上找到的每一個資源都解釋瞭如何手動構建請求。這裏是我發現的很多類似例子之一: http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/03efc98c-68e2-410c-bf25-d5facacbd920 – 2009-07-30 00:31:29
這個問題有一個答案,使用WebRequest發佈多部分/表單數據解決了您的問題。它運作良好。 http://stackoverflow.com/questions/219827/multipart-forms-from-c-client – Marek 2010-01-05 16:27:17