2009-07-15 27 views
65

मैं उस पर खोज और पढ़ रहा हूं और वास्तव में कुछ भी ठीक नहीं कर सका।HTTP POST के माध्यम से एक फ़ाइल भेजें C#

मुझे लगता है कि उपयोगकर्ता, एक वेब सर्वर पर फ़ाइलें भेजने के लिए नहीं एफ़टीपी द्वारा की अनुमति देता है एक छोटे सी # जीत एप्लिकेशन लिख रहा हूँ, लेकिन पोस्ट का उपयोग कर HTTP द्वारा। इसे वेब फॉर्म की तरह सोचें लेकिन विंडोज़ एप्लिकेशन पर चलें।

मेरे पास मेरी HttpWebRequest वस्तु इस

HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest 

की तरह कुछ का उपयोग कर बनाया है और यह भी Method, ContentType और ContentLength गुण सेट करें। लेकिन अब तक मैं जा सकता हूं।

HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest; 
req.KeepAlive = false; 
req.Method = "POST"; 
req.Credentials = new NetworkCredential(user.UserName, user.UserPassword); 
req.PreAuthenticate = true; 
req.ContentType = file.ContentType; 
req.ContentLength = file.Length; 
HttpWebResponse response = null; 

try 
{ 
    response = req.GetResponse() as HttpWebResponse; 
} 
catch (Exception e) 
{ 
} 

तो मेरे सवाल का मूल रूप से मैं कैसे साथ सी # HTTP POST के माध्यम से एक छी (पाठ फ़ाइल, छवि, ऑडियो, आदि) भेज सकते हैं:

इस कोड के अपने टुकड़ा है।

धन्यवाद!

+0

कृपया जांच करें http://stackoverflow.com/questions/15738847/sending-files-using-http-post-in-c-sharp/15739707#15739707 – Sudha

उत्तर

79

.NET 4.5 का उपयोग करना (या NuGet से Microsoft.Net.Http पैकेज जोड़कर .NET 4.0) फ़ॉर्म अनुरोधों को अनुकरण करने का एक आसान तरीका है।

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; 
    } 
} 
+3

पर ध्यान दें मुझे यह उत्तर और उदाहरण पसंद है। एचटीएमएल फॉर्म सबमिशन के लिए सबसे समान। – jocull

+0

मुझे प्राप्त फ़ील्ड को पहचानने के लिए सर्वर स्क्रिप्ट प्राप्त करने के लिए, 'formData.Add()' में तीसरे पैरामीटर को हटाने की आवश्यकता थी जब सामग्री 'स्ट्रिंगकंटेंट' टाइप की गई थी। – dAngelov

+0

यदि संभव हो तो इस विधि को कॉल करने का एक सरल उदाहरण दिखा सकता है? – Jacobr365

41

कच्चे फ़ाइल केवल भेजने के लिए:

using(WebClient client = new WebClient()) { 
    client.UploadFile(address, filePath); 
} 

आप एक <input type="file"/> के साथ एक ब्राउज़र प्रपत्र का अनुकरण करना चाहते हैं तो यह है कि कठिन है,। मल्टीपार्ट/फॉर्म-डेटा उत्तर के लिए this answer देखें।

+0

(आप निश्चित रूप से हेडर/क्रेडेंशियल्स/आदि को सामान्य के रूप में जोड़ सकते हैं) –

+1

धन्यवाद, मैंने इसे कुछ सरल के साथ उपयोग किया है और मैंने काम नहीं किया है। अब, जैसा कि आप कहते हैं, मुझे ब्राउज़र इनपुट फ़ाइल का अनुकरण करने की आवश्यकता है, इस की तरह somethig। – gabitoju

+1

मैंने उपरोक्त कोड का उपयोग किया है और त्रुटि मिली है: उपयोगकर्ता कोड द्वारा तर्क अपवाद को अनचाहे किया गया था: {"यूआरआई प्रारूप समर्थित नहीं हैं।"}। मैं यह कैसे कर सकता हूँ? संरक्षित शून्य पृष्ठ_लोड (ऑब्जेक्ट प्रेषक, EventArgs ई) { स्ट्रिंग पता = "http: www.testproject.com/SavedFiles"; स्ट्रिंग filepath = @ "डी: \ test \ FileOperations \ testfile.txt"; (वेब ​​क्लाइंट क्लाइंट = नया वेब क्लाइंट()) { क्लाइंट का उपयोग कर।अपलोडफाइल (पता, फ़ाइलपैथ); } } – Sudha

4

आप अनुरोध धारा के लिए अपनी फ़ाइल लिखने की ज़रूरत:

using (var reqStream = req.GetRequestStream()) 
{  
    reqStream.Write(...) // write the bytes of the file 
} 
4

मैं एक ही समस्या मिला था और इस के लिए निम्न कोड इस समस्या पर पूरी तरह से उत्तर दिया:

//Identificate separator 
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 
//Encoding 
byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); 

//Creation and specification of the request 
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); //sVal is id for the webService 
wr.ContentType = "multipart/form-data; boundary=" + boundary; 
wr.Method = "POST"; 
wr.KeepAlive = true; 
wr.Credentials = System.Net.CredentialCache.DefaultCredentials; 

string sAuthorization = "login:password";//AUTHENTIFICATION BEGIN 
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(sAuthorization); 
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes); 
wr.Headers.Add("Authorization: Basic " + returnValue); //AUTHENTIFICATION END 
Stream rs = wr.GetRequestStream(); 


string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; //For the POST's format 

//Writting of the file 
rs.Write(boundarybytes, 0, boundarybytes.Length); 
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(Server.MapPath("questions.pdf")); 
rs.Write(formitembytes, 0, formitembytes.Length); 

rs.Write(boundarybytes, 0, boundarybytes.Length); 

string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; 
string header = string.Format(headerTemplate, "file", "questions.pdf", contentType); 
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 
rs.Write(headerbytes, 0, headerbytes.Length); 

FileStream fileStream = new FileStream(Server.MapPath("questions.pdf"), FileMode.Open, FileAccess.Read); 
byte[] buffer = new byte[4096]; 
int bytesRead = 0; 
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
{ 
    rs.Write(buffer, 0, bytesRead); 
} 
fileStream.Close(); 

byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); 
rs.Write(trailer, 0, trailer.Length); 
rs.Close(); 
rs = null; 

WebResponse wresp = null; 
try 
{ 
    //Get the response 
    wresp = wr.GetResponse(); 
    Stream stream2 = wresp.GetResponseStream(); 
    StreamReader reader2 = new StreamReader(stream2); 
    string responseData = reader2.ReadToEnd(); 
} 
catch (Exception ex) 
{ 
    string s = ex.Message; 
} 
finally 
{ 
    if (wresp != null) 
    { 
     wresp.Close(); 
     wresp = null; 
    } 
    wr = null; 
} 
0

बाइट सरणियों से के रूप में फाइल पोस्ट करने के लिए:

private static string UploadFilesToRemoteUrl(string url, IList<byte[]> files, NameValueCollection nvc) { 

     string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x"); 

     var request = (HttpWebRequest) WebRequest.Create(url); 
     request.ContentType = "multipart/form-data; boundary=" + boundary; 
     request.Method = "POST"; 
     request.KeepAlive = true; 
     var postQueue = new ByteArrayCustomQueue(); 

     var formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; 

     foreach (string key in nvc.Keys) { 
      var formitem = string.Format(formdataTemplate, key, nvc[key]); 
      var formitembytes = Encoding.UTF8.GetBytes(formitem); 
      postQueue.Write(formitembytes); 
     } 

     var headerTemplate = "\r\n--" + boundary + "\r\n" + 
      "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + 
      "Content-Type: application/zip\r\n\r\n"; 

     var i = 0; 
     foreach (var file in files) { 
      var header = string.Format(headerTemplate, "file" + i, "file" + i + ".zip"); 
      var headerbytes = Encoding.UTF8.GetBytes(header); 
      postQueue.Write(headerbytes); 
      postQueue.Write(file); 
      i++; 
     } 

     postQueue.Write(Encoding.UTF8.GetBytes("\r\n--" + boundary + "--")); 

     request.ContentLength = postQueue.Length; 

     using (var requestStream = request.GetRequestStream()) { 
      postQueue.CopyToStream(requestStream); 
      requestStream.Close(); 
     } 

     var webResponse2 = request.GetResponse(); 

     using (var stream2 = webResponse2.GetResponseStream()) 
     using (var reader2 = new StreamReader(stream2)) { 

      var res = reader2.ReadToEnd(); 
      webResponse2.Close(); 
      return res; 
     } 
    } 

public class ByteArrayCustomQueue { 

    private LinkedList<byte[]> arrays = new LinkedList<byte[]>(); 

    /// <summary> 
    /// Writes the specified data. 
    /// </summary> 
    /// <param name="data">The data.</param> 
    public void Write(byte[] data) { 
     arrays.AddLast(data); 
    } 

    /// <summary> 
    /// Gets the length. 
    /// </summary> 
    /// <value> 
    /// The length. 
    /// </value> 
    public int Length { get { return arrays.Sum(x => x.Length); } } 

    /// <summary> 
    /// Copies to stream. 
    /// </summary> 
    /// <param name="requestStream">The request stream.</param> 
    /// <exception cref="System.NotImplementedException"></exception> 
    public void CopyToStream(Stream requestStream) { 
     foreach (var array in arrays) { 
      requestStream.Write(array, 0, array.Length); 
     } 
    } 
} 
5

मुझे client.UploadFile के लिए अभी भी एक बहुखण्डीय अनुरोध में सामग्री लिपटे तो मैं इस तरह यह करना ही था:

यहाँ एक उदाहरण है
using (WebClient client = new WebClient()) 
{ 
    client.Headers.Add("Content-Type", "application/octet-stream"); 
    using (Stream fileStream = File.OpenRead(filePath)) 
    using (Stream requestStream = client.OpenWrite(new Uri(fileUploadUrl), "POST")) 
    { 
     fileStream.CopyTo(requestStream); 
    } 
} 
0
 public string SendFile(string filePath) 
      { 
       WebResponse response = null; 
       try 
       { 
        string sWebAddress = "Https://www.address.com"; 

        string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); 
        byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); 
        HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(sWebAddress); 
        wr.ContentType = "multipart/form-data; boundary=" + boundary; 
        wr.Method = "POST"; 
        wr.KeepAlive = true; 
        wr.Credentials = System.Net.CredentialCache.DefaultCredentials; 
        Stream stream = wr.GetRequestStream(); 
        string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; 

        stream.Write(boundarybytes, 0, boundarybytes.Length); 
        byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(filePath); 
        stream.Write(formitembytes, 0, formitembytes.Length); 
        stream.Write(boundarybytes, 0, boundarybytes.Length); 
        string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; 
        string header = string.Format(headerTemplate, "file", Path.GetFileName(filePath), Path.GetExtension(filePath)); 
        byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 
        stream.Write(headerbytes, 0, headerbytes.Length); 

        FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
        byte[] buffer = new byte[4096]; 
        int bytesRead = 0; 
        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) 
         stream.Write(buffer, 0, bytesRead); 
        fileStream.Close(); 

        byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); 
        stream.Write(trailer, 0, trailer.Length); 
        stream.Close(); 

        response = wr.GetResponse(); 
        Stream responseStream = response.GetResponseStream(); 
        StreamReader streamReader = new StreamReader(responseStream); 
        string responseData = streamReader.ReadToEnd(); 
        return responseData; 
       } 
       catch (Exception ex) 
       { 
        return ex.Message; 
       } 
       finally 
       { 
        if (response != null) 
         response.Close(); 
       } 
      } 
संबंधित मुद्दे