2013-04-01 60 views
19

Tôi có một ứng dụng web nhỏ C#. Làm cách nào để nhận được mã C# cho phép người dùng gửi tệp bằng HTTP POST. Nó có thể gửi tệp văn bản, tệp hình ảnh, excel, csv , doc (tất cả các loại tệp) mà không cần sử dụng trình đọc luồng và tất cả.Gửi tập tin bằng cách sử dụng HTTP POST trong C#

+0

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

+2

'Tôi đã thử phương pháp khác nhau nhưng không ai trong số họ đã giúp tôi. '- nếu bạn cho thấy một số phương pháp bạn đã thử, chúng tôi có thể thấy có gì sai với chúng. Ngay bây giờ, thật khó để có một cuộc thảo luận mang tính xây dựng. –

+1

Bản sao của [Gửi tệp qua HTTP POST với C#] (http://stackoverflow.com/questions/1131425/send-a-file-via-http-post-with-c-sharp) và nhiều người khác. Hiển thị những gì bạn đã thử, và upvoters, xin vui lòng xem xét cho dù một câu hỏi bạn upvoting là một bổ sung chào mừng đến trang web hoặc chỉ là một bản sao. – CodeCaster

Trả lời

12

Bạn có thể thử đoạn mã sau:

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

Chỉ cần bán phá giá 50 dòng mã không phải là câu trả lời. Có rất nhiều câu trả lời cho câu hỏi này và nhiều người trong số các mã này là (nhiều lỗi bằng chứng quá) đã được xây dựng trong các loại. NET, như WebClient và HttpClient. – CodeCaster

+0

Bạn có thể giải thích quá trình truy xuất từ ​​trang người nhận không. –

+1

bạn có thể đưa ra ví dụ về url .. nó có chứa tên tệp không? –

8

thử này

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

Sử dụng .NET 4.5 (hoặc .NET 4.0 bằng cách thêm các gói Microsoft.Net.Http từ NuGet) có một cách dễ dàng hơn để mô phỏng các yêu cầu biểu mẫu. Dưới đây là một ví dụ:

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

Có bắt buộc phải sử dụng dữ liệu biểu mẫu nhiều phần không? – Abhijeet

Các vấn đề liên quan