C#에서 멀티 파트/양식 데이터 HTTP Post 요청을 제출하는 방법
-
05-07-2019 - |
문제
C#에서 멀티 파트/양식 데이터 컨텐츠 유형으로 HTTP 사후 요청을 제출하는 가장 쉬운 방법은 무엇입니까? 내 요청을 구축하는 것보다 더 나은 방법이 있어야합니다.
내가 요청하는 이유는이 API를 사용하여 Flickr에 사진을 업로드하는 것입니다.
해결책
우선, .NET Framework를 사용하여 HTTP 명령의 순수한 수동 구현에는 아무런 문제가 없습니다. 그것이 프레임 워크이고, 그것은 꽤 일반적이어야한다는 것을 명심하십시오.
둘째, .NET에서 브라우저 구현을 검색 할 수 있다고 생각합니다. 나는 보았다 이 하나, 아마도 그것은 당신이 요청한 문제를 다룰 것입니다. 아니면 그냥 검색 할 수 있습니다.C# http Put Get Post 요청". 결과 중 하나는 도움이 될 수있는 비없는 라이브러리로 이어집니다 (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. 결국 컴팩트 프레임 워크와 호환되는 업로드 헬퍼 라이브러리의 내 자신의 버전을 만들었습니다. 잘 작동하고 필요한 것을 정확하게 수행하는 것 같습니다.
System.net.webclient 클래스는 귀하가 찾고있는 것일 수 있습니다. WebClient.uploadfile의 설명서를 확인하면 UploadFile 오버로드 중 하나를 통해 지정된 리소스에 파일을 업로드 할 수 있습니다. 나는 이것이 데이터를 게시하는 데 사용하려는 방법이라고 생각합니다 ...
...처럼 사용할 수 있습니다 .... 이것은 단지 샘플 코드입니다. 테스트되지 않았습니다 ...
WebClient webClient = new WebClient ();
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
도움이 되었기를 바랍니다.
나는 보통 발견합니다 바이올리니스트 그 직업에 가장 적합한 도구가됩니다. 요청을 만들기가 매우 쉽고 심지어 일부 헤더를 생성합니다.