【问题标题】:REST Windows Phone Photo upload重置 Windows Phone 照片上传
【发布时间】:2011-02-21 14:42:01
【问题描述】:


我正在尝试使用 RestSharp 将照片上传到 Windows Phone 7 应用程序中的 REST api 用于我的 Gets/Posts。
post参数如下:

照片: 照片,编码为 multipart/form-data
photo_album_id: 现有相册的标识符,可以是事件或组 专辑

我已经创建了我的请求,但每次我返回"{\"details\":\"missing photo parameter\",\"problem\":\"The API request is malformed\"}\n

我的照片参数如下所示:

"---------------8cd9bfbafb3ca00\r\n内容-配置:表单-数据;name=\"文件名\" ; filename=\"somefile.jpg\"\r\nContent-Type: image/jpg\r\n\r\n(这里列出了一些二进制垃圾)\r\n----------- ------------------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;
    }

【问题讨论】:

    标签: rest windows-phone-7 multipartform-data restsharp


    【解决方案1】:

    Windows Phone 的 Hammock 让这一切变得非常简单。 您只需使用 AddFile 方法将文件添加到请求中并将其传递给照片流。

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

    【讨论】:

    • RestSharp 也有 request.AddFile() 。但是 Hammock 也是一个很棒的图书馆,我很高兴你解决了你的问题
    • 很高兴知道。谢谢。 Hammock 具有出色的 oauth 支持,这是切换的关键因素。我也很喜欢restsharp。很高兴有很酷的库可用。
    【解决方案2】:

    你确定你的 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";
    

    【讨论】:

    • 我看到的所有示例都与您的建议相似,所以让我感到困惑的是这个照片参数: photo - 照片,编码为 multipart/form-data。我最初尝试只是将 photo 参数的内容设置为二进制数据,但收到相同的格式错误的数据错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多