C\#HttpWebRequest 를 사용 하여 MultiPart 데 이 터 를 Post 로 제출 합 니 다.

7363 단어 request
C\#에 HttpWebRequest 클래스 가 있어 http 요청 을 쉽게 가 져 올 수 있 지만,이 클래스 는 Post 방식 에 데 이 터 를 가 져 오 는 데 편리 한 방법 을 제공 하지 않 습 니 다.인터넷 에서 많은 사람들 이 해결 방법 을 제 공 했 지만 모두 들쭉날쭉 하 다.여기 서 제 가 사용 하 는 방법 을 정리 해서 여러분 과 공유 하 겠 습 니 다.
이 글 의 정수: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; }

좋은 웹페이지 즐겨찾기