كيفية تقديم متعددة الأجزاء / شكل بيانات HTTP POST من طلب C #

StackOverflow https://stackoverflow.com/questions/1203811

سؤال

ما هي أسهل طريقة لتقديم طلب POST HTTP مع متعدد الأجزاء / شكل بيانات نوع المحتوى من C #؟ يجب أن يكون هناك طريقة أفضل من بناء طلب بلدي.

والسبب أنا أسأل هو لتحميل الصور إلى فليكر استخدام هذا المعهد:

http://www.flickr.com/services/api/upload. api.html

هل كانت مفيدة؟

المحلول

وأولا وقبل كل شيء، لا يوجد شيء خاطئ مع تنفيذ دليل محض الأوامر HTTP باستخدام .NET Framework. هل نأخذ في الاعتبار أنه من الإطار، وأنه من المفترض أن تكون عامة جدا.

وثانيا، اعتقد انه يمكن ان حاول البحث لتنفيذ المتصفح في صافي. رأيت هذا واحد ، وربما يغطي قضية طلبتم حول. أو يمكنك فقط البحث عن " C # HTTP وضع الحصول على وظيفة طلب ". واحدة من النتائج يؤدي إلى مكتبة غير المجانية التي قد تكون مفيدة ( Chilkat المتشعب)

إذا كنت يحدث لكتابة الإطار الخاص بك من الأوامر HTTP على رأس صافي - أعتقد أننا يمكن أن جميع الاستمتاع بها إذا كنت تشاركه: -)

نصائح أخرى

إذا كنت تستخدم. NET 4.5 استخدام هذا:

public string Upload(string url, NameValueCollection requestParameters, MemoryStream file)
        {

            var client = new HttpClient();
            var content = new MultipartFormDataContent();

            content.Add(new StreamContent(file));
            System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>> b = new List<KeyValuePair<string, string>>();
            b.Add(requestParameters);
            var addMe = new FormUrlEncodedContent(b);

            content.Add(addMe);
            var result = client.PostAsync(url, content);
            return result.Result.ToString();
        }

واستنادا إلا على إجابة ريان، أنا تحميل المكتبة وأنب قليلا.

  public class MimePart
        {
            NameValueCollection _headers = new NameValueCollection();
            byte[] _header;

            public NameValueCollection Headers
            {
                get { return _headers; }
            }

            public byte[] Header
            {
                get { return _header; }
            }

            public long GenerateHeaderFooterData(string boundary)
            {
                StringBuilder sb = new StringBuilder();

                sb.Append("--");
                sb.Append(boundary);
                sb.AppendLine();
                foreach (string key in _headers.AllKeys)
                {
                    sb.Append(key);
                    sb.Append(": ");
                    sb.AppendLine(_headers[key]);
                }
                sb.AppendLine();

                _header = Encoding.UTF8.GetBytes(sb.ToString());

                return _header.Length + Data.Length + 2;
            }

            public Stream Data { get; set; }
        }

        public string Upload(string url, NameValueCollection requestParameters, params MemoryStream[] files)
        {
            using (WebClient req = new WebClient())
            {
                List<MimePart> mimeParts = new List<MimePart>();

                try
                {
                    foreach (string key in requestParameters.AllKeys)
                    {
                        MimePart part = new MimePart();

                        part.Headers["Content-Disposition"] = "form-data; name=\"" + key + "\"";
                        part.Data = new MemoryStream(Encoding.UTF8.GetBytes(requestParameters[key]));

                        mimeParts.Add(part);
                    }

                    int nameIndex = 0;

                    foreach (MemoryStream file in files)
                    {
                        MimePart part = new MimePart();
                        string fieldName = "file" + nameIndex++;

                        part.Headers["Content-Disposition"] = "form-data; name=\"" + fieldName + "\"; filename=\"" + fieldName + "\"";
                        part.Headers["Content-Type"] = "application/octet-stream";

                        part.Data = file;

                        mimeParts.Add(part);
                    }

                    string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
                    req.Headers.Add(HttpRequestHeader.ContentType, "multipart/form-data; boundary=" + boundary);

                    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 (MemoryStream s = new MemoryStream())
                    {
                        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);
                        byte[] responseBytes = req.UploadData(url, s.ToArray());
                        string responseString = Encoding.UTF8.GetString(responseBytes);
                        return responseString;
                    }
                }
                catch
                {
                    foreach (MimePart part in mimeParts)
                        if (part.Data != null)
                            part.Data.Dispose();

                    throw;
                }
            }
        }

ولم أحاول ذلك بنفسي، ولكن يبدو أن هناك وسيلة المضمنة في C # لهذا (وإن لم يكن احد يعرف جدا على ما يبدو ...):

private static HttpClient _client = null;

private static void UploadDocument()
{
    // Add test file 
    var httpContent = new MultipartFormDataContent();
    var fileContent = new ByteArrayContent(File.ReadAllBytes(@"File.jpg"));
    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "File.jpg"
    };

    httpContent.Add(fileContent);
    string requestEndpoint = "api/Post";

    var response = _client.PostAsync(requestEndpoint, httpContent).Result;

    if (response.IsSuccessStatusCode)
    {
        // ...
    }
    else
    {
        // Check response.StatusCode, response.ReasonPhrase
    }
}

وجربه واسمحوا لي أن أعرف كيف ستسير الامور.

وهتاف!

ولقد كان النجاح مع رمز نشرها في aspnetupload كوم . انتهى بي الأمر جعل نسختي الخاصة من مكتبة UploadHelper بهم والذي يتوافق مع الاتفاق الإطاري. يعمل بشكل جيد، ويبدو أن تفعل بالضبط ما تحتاج.

ويمكن أن تكون الطبقة System.Net.WebClient ما كنت تبحث عنه. تحقق من وثائق WebClient.UploadFile، يجب أن تسمح لك لتحميل ملف إلى المورد المحدد عبر واحد من الزائدة UploadFile. وأعتقد أن هذا هو الأسلوب كنت تبحث لاستخدامها لنشر البيانات ...

ويمكن استخدامه مثل .... ملاحظة هذا هو رمز فقط عينة لم تختبر ...

وWebClient webClient = WebClient جديد ()؛

وwebClient.UploadFile ( " http://www.url.com/ReceiveUploadedFile.aspx "،" POST "، @" C: \ على Myfile.txt ")؛

وهنا هو المرجع MSDN إذا كنت مهتما.

http://msdn.microsoft.com /en-us/library/system.net.webclient.uploadfile.aspx

وآمل أن يساعد هذا.

وأنا عادة ما تجد عازف الكمان لتكون أفضل وسيلة لهذا المنصب. تخفيف جدا لخلق الطلبات وحتى أنه يولد بعض رؤوس بالنسبة لك.

عازف الكمان - كيفية إنشاء طلب

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top