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