1

尝试将照片上传到 flickr 时遇到问题。我有我的访问令牌并且我知道它正在工作,因为我可以毫无问题地调用flickr.people.getUploadStatus。因为我可以调用该方法,所以我已验证我要上传的文件符合特定配额(即文件小于 maxbytes。无论如何,我要上传的代码如下所示:

public string UploadToApi(Dictionary<string, string> parameters, string fileName)
{
    var apiUrl = BuildUrl(parameters, "http://api.flickr.com/services/upload/");
    var baseParameters = GetParameters(new Dictionary<string, string>() { { "oauth_token", accessKey } });
    var signature = OAuthProvider.GenerateSignature(new Uri(apiUrl), baseParameters, consumerSecret, accessSecret, "POST");

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

    var request = (HttpWebRequest)WebRequest.Create(apiUrl);
    request.Method = "POST";
    request.ContentType = "multipart/form-data; boundary=" + boundary;
    request.ServicePoint.Expect100Continue = false;

    var dictionary = baseParameters;
    dictionary.Add("oauth_signature", signature);

    using (var stream = request.GetRequestStream())
    using (var writer = new StreamWriter(stream))
    {
        foreach (var item in dictionary)
        {
            writer.WriteLine("--" + boundary);
            writer.WriteLine(string.Format("Content-Disposition: form-data; name=\"{0}\"", item.Key));
            writer.WriteLine();
            writer.WriteLine(item.Value);
        }

        writer.WriteLine("--" + boundary);
        writer.WriteLine("Content-Disposition: form-data; name=\"photo\"; filename=\"" + fileName + "\"");
        writer.WriteLine("Content-Type: image/png");
        writer.WriteLine();
        writer.Flush();

        using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
        {
            var buffer = new byte[4096];
            var bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                stream.Write(buffer, 0, bytesRead);
            }
        }                

        writer.WriteLine();
        writer.WriteLine(boundary + "--");
    }

    using (var response = request.GetResponse())
    {
        var httpResponse = (HttpWebResponse)response;
        using (var data = response.GetResponseStream())
        {
            using (var reader = new StreamReader(data))
            {
                return reader.ReadToEnd();
            }
        }
    }
}

我得到的响应是signature_invalid但是当我比较debug_sbs时,我发现基本字符串与我生成的基本字符串完全相同。

POST&http%3A%2F%2Fapi.flickr.com%2Fservices%2Fupload%2F&oauth_consumer_key%3D<key>%26oauth_nonce%3D56372bb9-3d98-4009-b03e-981a36345e17%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1372442086%26oauth_token%3D<token>%26oauth_version%3D1.0

另外,为了确保我正在创建签名权,我使用了http://hueniverse.com/oauth/guide/authentication/并输入了我的详细信息,它得到了完全相同的 UrlEncoded 签名......

使用提琴手这是我的帖子:

POST http://api.flickr.com/services/upload/ HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------8d0424817e13cb4
Host: api.flickr.com
Content-Length: 29993

-----------------------------8d0424817e13cb4
Content-Disposition: form-data; name="oauth_consumer_key"

<my consumer key>
-----------------------------8d0424817e13cb4
Content-Disposition: form-data; name="oauth_nonce"

56372bb9-3d98-4009-b03e-981a36345e17
-----------------------------8d0424817e13cb4
Content-Disposition: form-data; name="oauth_timestamp"

1372442086
-----------------------------8d0424817e13cb4
Content-Disposition: form-data; name="oauth_signature_method"

HMAC-SHA1
-----------------------------8d0424817e13cb4
Content-Disposition: form-data; name="oauth_version"

1.0
-----------------------------8d0424817e13cb4
Content-Disposition: form-data; name="oauth_token"

<my oauth token>
-----------------------------8d0424817e13cb4
Content-Disposition: form-data; name="oauth_signature"

XgJKthsbl03WT0ucespIWhmLNQw%3D
-----------------------------8d0424817e13cb4
Content-Disposition: form-data; name="photo"; filename="C:\Users\r3plica\Dropbox\Projects\Skipstone\Code\Skipstone\Skipstone\Public\Uploads\1637376f-dab6-4944-be5f-53b2603f33c1\0\558c0a8b-8db0-4dba-8481-25a96f9b9f21.png"
Content-Type: image/png

<binary data here>
---------------------------8d0424817e13cb4--

谁能阐明我做错了什么?

干杯,/r3plica

4

0 回答 0