C\#HttpWebRequest 를 사용 하여 MultiPart 데 이 터 를 Post 로 제출 합 니 다.
7363 단어 request
이 글 의 정수:post 를 실현 할 때 문자열 이 있 는 key-value 를 실현 하고 파일 도 가 져 갈 수 있 습 니 다.
포스트 데이터 형식
Post 에서 데 이 터 를 제출 할 때 가장 중요 한 것 은 키-Value 의 데 이 터 를 http 요청 흐름 에 넣 는 것 입 니 다.HttpWebRequest 는 키-Value 를 자 유 롭 게 추가 할 수 있 는 속성 같은 것 을 제공 하지 않 았 기 때문에 이 데 이 터 를 수 동 으로 구성 해 야 합 니 다.
RFC 2045프로 토 콜 에 따 르 면 Http Post 의 데이터 형식 은 다음 과 같 습 니 다.
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
Content-Disposition: form-data; name="file"; filename="file1.dat"
Content-Type: application/octet-stream
... contents of file1.dat ...
--AaB03x--
상세 한 설명 은 다음 과 같다.
Content-Type: multipart/form-data; boundary=AaB03x
위 에서 보 듯 이 먼저 데이터 형식 을 multipart/form-data 로 설명 한 다음 에 경계 문자열 AaB03x 를 정의 합 니 다.이 경계 문자열 은 아래 에서 각 데 이 터 를 구분 하 는 데 사 용 됩 니 다.마음대로 정의 할 수 있 지만 대시 등 데이터 에 나타 나 지 않 는 문자 로 정의 하 는 것 이 좋 습 니 다.그리고 줄 바 꾸 기.
메모:Post 에서 정의 하 는 줄 바 꿈 자 는\r 입 니 다.
--AaB03x
이것 은 경계 문자열 입 니 다.모든 경계 문자 앞 에 두 개의 연결 문자'-'를 추가 한 다음 줄 바 꿈 자 를 따라 가 야 합 니 다.
Content-Disposition: form-data; name="submit-name"
키-Value 데이터 의 문자열 형식의 데이터 입 니 다.submit-name 은 이 Key-Value 데이터 의 Key 입 니 다.물론 줄 바 꿈 도 필요 하 다.
Larry
이게 아까 Key-Value 데이터 의 value 입 니 다.
--AaB03x
경계 문자,데이터 가 끝 났 음 을 표시 합 니 다.
Content-Disposition: form-data; name="file"; filename="file1.dat"
이것 은 다른 데 이 터 를 대표 합 니 다.키 는 file 이 고 파일 이름 은 file1.dat 입 니 다.주의:맨 뒤에 분점 이 없습니다.
Content-Type: application/octet-stream
이 표지 파일 형식 입 니 다.application/ocket-stream 은 바 이 너 리 데 이 터 를 표시 합 니 다.
... contents of file1.dat ...
이것 은 문서 내용 입 니 다.바 이 너 리 데 이 터 를 사용 할 수 있 습 니 다.
--AaB03x--
데이터 가 끝 난 후의 분계 부 호 는 이 뒤에 데이터 가 없 기 때문에 뒤에'-'를 추가 하여 끝 을 표시 해 야 합 니 다.
C\#포스트 데이터 의 함수
형식 을 알 게 된 후에 우 리 는 C\#의 코드 를 쉽게 쓸 수 있다.다음 과 같다.
private static string HttpPostData(string url, int timeOut, string fileKeyName,
string filePath, NameValueCollection stringDict)
{
string responseContent;
var memStream = new MemoryStream();
var webRequest = (HttpWebRequest)WebRequest.Create(url);
//
var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");
//
var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r
");
var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
//
var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r
");
//
webRequest.Method = "POST";
webRequest.Timeout = timeOut;
webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
//
const string filePartHeader =
"Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r
"+
"Content-Type: application/octet-stream\r
\r
";
var header = string.Format(filePartHeader, fileKeyName, filePath);
var headerbytes = Encoding.UTF8.GetBytes(header);
memStream.Write(beginBoundary, 0, beginBoundary.Length);
memStream.Write(headerbytes, 0, headerbytes.Length);
var buffer = new byte[1024];
int bytesRead; // =0
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}
// Key
var stringKeyHeader = "\r
--" + boundary +
"\r
Content-Disposition: form-data; name=\"{0}\""+
"\r
\r
{1}\r
";
foreach (byte[] formitembytes in from string key in stringDict.Keys
select string.Format(stringKeyHeader, key, stringDict[key])
into formitem
select Encoding.UTF8.GetBytes(formitem))
{
memStream.Write(formitembytes, 0, formitembytes.Length);
}
//
memStream.Write(endBoundary, 0, endBoundary.Length);
webRequest.ContentLength = memStream.Length;
var requestStream = webRequest.GetRequestStream();
memStream.Position = 0;
var tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer, 0, tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer, 0, tempBuffer.Length);
requestStream.Close();
var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();
using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(),
Encoding.GetEncoding("utf-8")))
{
responseContent = httpStreamReader.ReadToEnd();
}
fileStream.Close();
httpWebResponse.Close();
webRequest.Abort();
return responseContent;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java에서 HttpRequest Header를 가져오는 몇 가지 방법이 포털은 모든 응용 프로그램의 입구이다. 사용자가 포털에 로그인한 후에 다른 시스템에 들어가면 유사한 단일 로그인(SSO)이 필요하다.각 서브시스템에 들어갈 때 다시 로그인할 필요가 없다. 물론 유사한 기능은 전문...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.