C#からmultipart / form-data HTTP POSTリクエストを送信する方法
-
05-07-2019 - |
質問
C#のmultipart / form-dataコンテンツタイプでHTTP POSTリクエストを送信する最も簡単な方法は何ですか?独自のリクエストを作成するよりも良い方法が必要です。
私が尋ねている理由は、このAPIを使用してFlickrに写真をアップロードすることです:
解決
まず、.Netフレームワークを使用したHTTPコマンドの純粋な手動実装に問題はありません。フレームワークであり、かなり汎用的であることになっていることに留意してください。
次に、.Netでブラウザの実装を検索してみてください。 これを見ました。おそらくあなたが尋ねた問題をカバーしています約。または、単に" を検索することもできます。 C#http put get post request "。結果の1つは、役立つ可能性のある非フリーライブラリにつながります( Chilkat Http)
.Netの上にHTTPコマンドの独自のフレームワークを作成する場合-共有すればそれを楽しむことができると思います:-)
他のヒント
.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();
}
それ以外の場合、Ryanの回答に基づいて、ライブラリをダウンロードし、少し調整しました。
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;
}
}
}
私は自分でこれを試したことはありませんが、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
}
}
試してみて、どうなるか教えてください。
乾杯!
aspnetuploadに投稿されたコードで成功しました。 .com 。最終的に、Compact Frameworkと互換性のあるUploadHelperライブラリの独自バージョンを作成しました。うまく機能し、必要なことを正確に行うようです。
System.Net.WebClientクラスは、あなたが探しているものかもしれません。 WebClient.UploadFileのドキュメントを確認してください。UploadFileオーバーロードの1つを介して、指定されたリソースにファイルをアップロードできます。これは、データを投稿するために使用しようとしている方法だと思います...
次のように使用できます。...これはテストされていない単なるサンプルコードであることに注意してください...
WebClient webClient = new WebClient();
webClient.UploadFile(&quot; http://www.url.com/ReceiveUploadedFile.aspx&quot;、&quot; POST&quot;、@&quot; c:\ myfile.txt&quot;);
興味のある方は、MSDNリファレンスをご覧ください。
http://msdn.microsoft.com /en-us/library/system.net.webclient.uploadfile.aspx
これがお役に立てば幸いです。