【问题标题】:Uploading photos to flickr (Java)将照片上传到 flickr (Java)
【发布时间】:2013-04-16 17:53:21
【问题描述】:

我是一个试图弄清楚 Flickr API 的初学者。 我正在尝试创建一个将图片上传到 Flickr 的简单应用程序。

在尝试发送上传照片的请求时,我收到“无效签名”响应。

这是我签名的基本字符串:

POST&http%3A%2F%2Fapi.flickr.com%2Fservices%2Fupload&oauth_consumer_key%3D3f1e1948c1db9a45ca95febef6f5590e%26oauth_nonce%3D6151b3221a15f56c82ba0df47d57637e%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1366133923%26oauth_token%3D72157633261587382-7dcbe2359dbcfb06%26oauth_version%3D1.0

我在请求用户身份验证时基本上做了同样的事情,但使用访问令牌作为参数。

这是我的请求代码:

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;

import org.apache.commons.codec.DecoderException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

public class Test {

  /**
   * @param args
 * @throws DecoderException 
 * @throws SignatureException 
 * @throws NoSuchAlgorithmException 
   */
  public static void main(String[] args) throws NoSuchAlgorithmException, SignatureException, DecoderException {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://api.flickr.com/services/upload");

    try {
      FileBody bin = new FileBody(new File("/Users/[MYUSERNAME]/Desktop/Untitled-1.png"));

      MultipartEntity reqEntity = new MultipartEntity();
      reqEntity.addPart("photo", bin);

      reqEntity.addPart("api_key", new StringBody(Utils.consumer_key));
      reqEntity.addPart("oauth_token", new StringBody(Utils.oauth_token));
      reqEntity.addPart("api_sig", new StringBody(Request.sig()));
      httppost.setEntity(reqEntity);

      System.out.println("Requesting : " + httppost.getRequestLine());
      ResponseHandler<String> responseHandler = new BasicResponseHandler();
      String responseBody = httpclient.execute(httppost, responseHandler);

      System.out.println("responseBody : " + responseBody);

    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      httpclient.getConnectionManager().shutdown();
    }
  }

}

我对发送 MIME 请求的理解是否有问题,还是只是签名?如果是这样,我应该如何构建我的签名? 谢谢。

【问题讨论】:

    标签: java upload flickr


    【解决方案1】:

    我认为问题出在 FileBody 构造函数上

    FileBody bin = new FileBody(new File("/Users/[MYUSERNAME]/Desktop/Untitled-1.png"));

    如果使用这个构造函数,MultiPart Encoding 的结果是

    内容配置:表单数据;名称="照片";

    而预期的请求应该是

    内容配置:表单数据;名称="照片";文件名="Untitled-1.png"

    所以这里要使用的正确构造函数是

    new FileBody(new File("/Users/[MYUSERNAME]/Desktop/Untitled-1.png"),ContentType.APPLICATION_OCTET_STREAM, "Untitled-1.png")

    虽然我没有尝试自己执行你的代码,但希望这能解决你的问题。

    【讨论】:

      【解决方案2】:

      基本上,要使用 Flickr api 进行任何操作,您需要某种类型的授权“令牌” - 根据您进行身份验证的方式,您可能会获得不同的授权令牌。有两种类型的授权令牌:

      1. oauth 令牌 - 如果您进行 oauth 身份验证
      2. 身份验证令牌 - 如果您使用旧的deprecated authentication method

      Flickr 的 api 文档只展示了如何使用 auth token 上传(#2),但也可以使用 Oauth 上传以获得 oauth token(只是没有记录)。您的问题似乎是您将 ouath 令牌 与 Flickr 的 auth 令牌 上传方法混为一谈。

      如果您要使用 Oauth 身份验证,您需要传递 api_keyapi_sig 的 Oauth 等效项,即 oauth_consumer_key 和 oauth_signature。此外,适当的 Oauth 有效负载应包含 oauth_timestampoauth_nonceoauth_signature_methodoauth_version

      还有一点需要注意:您还需要在原始 Oauth 身份验证中传递 perms=write 参数,以便为您的 oauth 令牌 启用写入权限 - 否则您将没有上传权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        相关资源
        最近更新 更多