2013-04-01 2 views
19

나는 C# 코드가 작은 텍스트 파일, 이미지 파일을 보낼 수 있어야합니다. , doc (모든 유형의 파일)을 사용합니다.HTTP POST를 사용하여 파일을 보내는 중 C#

+0

http://stackoverflow.com/questions/566462/upload-files-with-httpwebrequest-multipart-form-data –

+2

'나는 다른 방법을 시도했지만 그들 중 누구도 나에게 도움이되지 예를 들면 다음과 같습니다. '- 당신이 시도한 몇 가지 방법을 보여 주면, 우리는 그들에게 무엇이 잘못되었는지를 볼 수있을 것입니다. 지금 당장은 건설적인 토론이 어렵습니다. –

+1

[C#으로 HTTP POST를 통해 파일 보내기] (http://stackoverflow.com/questions/1131425/send-a-file-via-http-post-with-c-sharp) 및 기타 여러 항목이 중복되었습니다. 당신이 시도한 것을 보여주고, 상향 자들, 당신이 상향 투표하는 질문이 그 사이트에 대한 환영의 추가인지 혹은 단지 중복인지를 고려하십시오. – CodeCaster

답변

12

다음과 같은 코드를 시도 할 수 있습니다 :

public void PostMultipleFiles(string url, string[] files) 
{ 
    string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x"); 
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
    httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary; 
    httpWebRequest.Method = "POST"; 
    httpWebRequest.KeepAlive = true; 
    httpWebRequest.Credentials = System.Net.CredentialCache.DefaultCredentials; 
    Stream memStream = new System.IO.MemoryStream(); 
    byte[] boundarybytes =System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary  +"\r\n"); 
    string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; 
    string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n"; 
    memStream.Write(boundarybytes, 0, boundarybytes.Length); 
    for (int i = 0; i < files.Length; i++) 
    { 
     string header = string.Format(headerTemplate, "file" + i, files[i]); 
     //string header = string.Format(headerTemplate, "uplTheFile", files[i]); 
     byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 
     memStream.Write(headerbytes, 0, headerbytes.Length); 
     FileStream fileStream = new FileStream(files[i], FileMode.Open, 
     FileAccess.Read); 
     byte[] buffer = new byte[1024]; 
     int bytesRead = 0; 
     while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
     { 
      memStream.Write(buffer, 0, bytesRead); 
     } 
     memStream.Write(boundarybytes, 0, boundarybytes.Length); 
     fileStream.Close(); 
    } 
    httpWebRequest.ContentLength = memStream.Length; 
    Stream requestStream = httpWebRequest.GetRequestStream(); 
    memStream.Position = 0; 
    byte[] tempBuffer = new byte[memStream.Length]; 
    memStream.Read(tempBuffer, 0, tempBuffer.Length); 
    memStream.Close(); 
    requestStream.Write(tempBuffer, 0, tempBuffer.Length); 
    requestStream.Close(); 
    try 
    { 
     WebResponse webResponse = httpWebRequest.GetResponse(); 
     Stream stream = webResponse.GetResponseStream(); 
     StreamReader reader = new StreamReader(stream); 
     string var = reader.ReadToEnd(); 

    } 
    catch (Exception ex) 
    { 
     response.InnerHtml = ex.Message; 
    } 
    httpWebRequest = null; 
} 
+14

그냥 50 줄의 코드를 버리는 것은 답이 아닙니다. 이 질문에 대한 답변이 많으며이 코드의 대부분은 WebClient 및 HttpClient와 같은 .NET 유형에 이미 내장되어 있습니다. – CodeCaster

+0

수신자 페이지에서 검색 과정을 설명 할 수 있습니까? –

+1

URL의 예를 들어 줄 수 있습니까? 파일 이름이 포함되어 있습니까? –

8

시도이 .NET 4.5 (또는 NuGet에서 Microsoft.Net.Http 패키지를 추가하여 .NET 4.0) 쉬운 방법으로이 사용

string fileToUpload = @"c:\user\test.txt"; 
string url = "http://example.com/upload"; 
using (var client = new WebClient()) 
{ 
byte[] result = client.UploadFile(url, fileToUpload); 
string responseAsString = Encoding.Default.GetString(result); 
} 
9

양식 요청을 시뮬레이트합니다.

private System.IO.Stream Upload(string actionUrl, string paramString, Stream paramFileStream, byte [] paramFileBytes) 
{ 
    HttpContent stringContent = new StringContent(paramString); 
    HttpContent fileStreamContent = new StreamContent(paramFileStream); 
    HttpContent bytesContent = new ByteArrayContent(paramFileBytes); 
    using (var client = new HttpClient()) 
    using (var formData = new MultipartFormDataContent()) 
    { 
     formData.Add(stringContent, "param1", "param1"); 
     formData.Add(fileStreamContent, "file1", "file1"); 
     formData.Add(bytesContent, "file2", "file2"); 
     var response = client.PostAsync(actionUrl, formData).Result; 
     if (!response.IsSuccessStatusCode) 
     { 
      return null; 
     } 
     return response.Content.ReadAsStreamAsync().Result; 
    } 
} 
+0

항상 다중 부분 양식 데이터를 사용해야합니까? – Abhijeet

관련 문제