Upload files with HTTPWebrequest (multipart/form-data)

后端 未结 21 3230
独厮守ぢ
独厮守ぢ 2020-11-21 04:53

Is there any class, library or some piece of code which will help me to upload files with HTTPWebrequest?

Edit 2:

I do not

21条回答
  •  生来不讨喜
    2020-11-21 05:08

    There is another working example with some my comments :

            List mimeParts = new List();
    
            try
            {
                foreach (string key in form.AllKeys)
                {
                    StringMimePart part = new StringMimePart();
    
                    part.Headers["Content-Disposition"] = "form-data; name=\"" + key + "\"";
                    part.StringData = form[key];
    
                    mimeParts.Add(part);
                }
    
                int nameIndex = 0;
    
                foreach (UploadFile file in files)
                {
                    StreamMimePart part = new StreamMimePart();
    
                    if (string.IsNullOrEmpty(file.FieldName))
                        file.FieldName = "file" + nameIndex++;
    
                    part.Headers["Content-Disposition"] = "form-data; name=\"" + file.FieldName + "\"; filename=\"" + file.FileName + "\"";
                    part.Headers["Content-Type"] = file.ContentType;
    
                    part.SetStream(file.Data);
    
                    mimeParts.Add(part);
                }
    
                string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
    
                req.ContentType = "multipart/form-data; boundary=" + boundary;
                req.Method = "POST";
    
                long contentLength = 0;
    
                byte[] _footer = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");
    
                foreach (MimePart part in mimeParts)
                {
                    contentLength += part.GenerateHeaderFooterData(boundary);
                }
    
                req.ContentLength = contentLength + _footer.Length;
    
                byte[] buffer = new byte[8192];
                byte[] afterFile = Encoding.UTF8.GetBytes("\r\n");
                int read;
    
                using (Stream s = req.GetRequestStream())
                {
                    foreach (MimePart part in mimeParts)
                    {
                        s.Write(part.Header, 0, part.Header.Length);
    
                        while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0)
                            s.Write(buffer, 0, read);
    
                        part.Data.Dispose();
    
                        s.Write(afterFile, 0, afterFile.Length);
                    }
    
                    s.Write(_footer, 0, _footer.Length);
                }
    
                return (HttpWebResponse)req.GetResponse();
            }
            catch
            {
                foreach (MimePart part in mimeParts)
                    if (part.Data != null)
                        part.Data.Dispose();
    
                throw;
            }
    

    And there is example of using :

                UploadFile[] files = new UploadFile[] 
                { 
                    new UploadFile(@"C:\2.jpg","new_file","image/jpeg") //new_file is id of upload field
                };
    
                NameValueCollection form = new NameValueCollection();
    
                form["id_hidden_input"] = "value_hidden_inpu"; //there is additional param (hidden fields on page)
    
    
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(full URL of action);
    
                // set credentials/cookies etc. 
                req.CookieContainer = hrm.CookieContainer; //hrm is my class. i copied all cookies from last request to current (for auth)
                HttpWebResponse resp = HttpUploadHelper.Upload(req, files, form);
    
                using (Stream s = resp.GetResponseStream())
                using (StreamReader sr = new StreamReader(s))
                {
                    string response = sr.ReadToEnd();
                }
                 //profit!
    

提交回复
热议问题