سؤال


أحاول تحميل صورة إلى REST API في تطبيق Windows Phone 7 باستخدام RestSharp للحصول على/المشاركات الخاصة بي.
معلمات النشر هي كما يلي:

صورة:الصورة مشفرة كبيانات متعددة الأجزاء/النموذج
photo_album_id:معرف ألبوم صور موجود ، والذي قد يكون حدثًا أو ألبومًا جماعيًا

لقد قمت بإنشاء طلبي، ولكن في كل مرة أعود "{\"details\":\"missing photo parameter\",\"problem\":\"The API request is malformed\"}\n

تبدو معلمة الصورة الخاصة بي كما يلي:

"---------------------------8cd9bfbafb3ca00 الترتيب للمحتوى:بيانات النموذج؛name=\"اسم الملف\";filename=\"somefile.jpg\" نوع المحتوى:image/jpg (بعض الملفات الثنائية غير المرغوب فيها مدرجة هنا) ------------------------------------------ -8cd9bfbafb3ca00--"

لست متأكدًا تمامًا مما إذا كانت هناك مشكلة في كيفية تقديم البيانات الثنائية للصورة (حاليًا في حدث PhotoTaskCompleted الخاص بي، قرأت محتويات e.ChosenPhoto في بايت[] وقمت بتمرير ذلك إلى طريقة مساعدة لـ إنشاء بيانات النموذج) أو إذا لم أقوم بإنشاء النموذج بشكل صحيح.

أنا فقط أحاول القيام بذلك بشكل بسيط قدر الإمكان، ثم يمكنني إعادة البناء بمجرد أن أعرف كيف يعمل كل شيء.

 void ImageObtained(object sender, PhotoResult e)
    {

        var photo = ReadToEnd(e.ChosenPhoto);
        var form = PostForm(photo);
        var request = new RequestWrapper("photo", Method.POST);
        request.AddParameter("photo_album_id", _album.album_id);
        request.AddParameter("photo", form);

        request.Client.ExecuteAsync<object>(request, (response) =>
          {
               var s = response.Data;
          });
    }

    private string CreateBoundary()
    {
        return "---------------------------" + DateTime.Now.Ticks.ToString("x");

    }

    private string PostForm(byte[] data)
    {
        string boundary = CreateBoundary();
        StringBuilder post = new StringBuilder();
        post.Append(boundary);
        post.Append("\r\n");
        post.Append("Content-Disposition: form-data; name=\"filename\"; filename=\"somefile.jpg\"");
        post.Append("\r\n");
        post.Append("Content-Type: image/jpg");
        post.Append("\r\n\r\n");
        post.Append(ConvertBytesToString(data));
        post.Append("\r\n");
        post.Append("--");
        post.Append(boundary);
        post.Append("--");

        return post.ToString();
    }

    public static string ConvertBytesToString(byte[] bytes)
    {
        string output = String.Empty;
        MemoryStream stream = new MemoryStream(bytes);
        stream.Position = 0;
        using (StreamReader reader = new StreamReader(stream))
        {
            output = reader.ReadToEnd();
        }

        return output;
    }
هل كانت مفيدة؟

المحلول

Hammock لنظام Windows Phone يجعل هذا أمرًا بسيطًا للغاية.ما عليك سوى إضافة الملف إلى الطلب باستخدام ملف AddFile طريقة وتمريرها دفق الصور.

        var request = new RestRequest("photo", WebMethod.Post);
        request.AddParameter("photo_album_id", _album.album_id);
        request.AddFile("photo", filename, e.ChosenPhoto);

نصائح أخرى

Hum هل أنت متأكد من صحة PostForm الخاص بك؟يجب تعيين معلمات content-* في رؤوس POST وليس في النص الأساسي؟

var request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add(HttpRequestHeader.Authorization,"blabla");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top