1

我正在尝试使用 Photobucket API。我打算用 javascript 编写 UI,然后使用 AJAX 调用服务器,它基本上充当 Photobucket 服务器的代理。我将服务器用作代理,这样我的 Photobucket API consumer_secret 就不会公开。但是,我在使用 PHP 上传照片时遇到了一些问题。我已经能够从 API 中获得其他方法来工作,包括经过身份验证的方法,例如添加和删除相册。我一直在参考

http://pic.pbsrc.com/dev_help/WebHelpPublic/Content/Methods/Album/Upload%20Media%20to%20an%20Album.htm

http://pic.pbsrc.com/dev_help/WebHelpPublic/Content/Examples/Uploading%20Media.htm

我从未在 PHP 中完成文件上传,但我阅读了此处和网络上其他各种地方的一些帖子。基本上我有一个测试页面,它有一个 html 表单,将用户、专辑名称和文件发布到我服务器上的 php 脚本。表单被编码为 multipart/form-data。

当 POST 请求到达我服务器上的页面时。我的服务器查找用户集的令牌并设置基本的 oauth 参数。然后,它为 oauth 做所有必要的事情,与它在其他方法(一切正常的方法)中所做的事情完全相同。

我从基本字符串中排除了 uploadfile 参数,并且在生成 oauth 签名时使用了 POST 方法。对于我的 uploadfile 参数,我使用以下

$params['uploadfile']= '@'.$_FILES['file']['tmp_name'];

然后我像这样设置卷曲请求

$ch = curl_init($url.$resource);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); // Note $params is an array

$response = curl_exec($ch);

curl_close($ch);

我也尝试过添加

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible);');

但是,在所有这些 Photobucket 回来并说“身份验证失败签名检查失败”之后

我查看了我的基本字符串,它看起来不错。这是一个例子。我编辑了各种标记的实际值:

POST&http%3A%2F%2Fapi.photobucket.com%2Falbum%2Fusername%2Fupload&format%3Djson%26oauth_consumer_key%3D00000%26oauth_nonce%3D1313541553TcVIpWJ18WxEZeXO%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1313541553%26oauth_token%3D000000%26oauth_version%3D1.0%26title%3Dtitle%26type%3Dimage

我不认为我的基本字符串有问题,因为正如我所说,它看起来不错,而且我尝试过的任何其他方法都没有问题。我认为 curl 发送数据的方式存在问题,原因有两个。

1) 起初,当我尝试执行删除请求时,我在删除相册时遇到了问题,并且遇到了类似的错误,但是,当我只是使用添加的参数进行发布请求时,_method=DELETE一切正常

2)这是我遇到问题的唯一方法,到目前为止,它是唯一需要将发送的数据编码为 multipart/form-data 的方法

我会认为这与我分配 uploadfile 参数的方式有关,但它并没有抱怨文件只有签名和文档说将该参数排除在基本字符串之外。

有人有想法吗?现在我在想我错过了一些 curl_setopt 的。

我会将我的请求与参考链接中的示例进行比较,但我不知道如何查看 Curl 请求的正文(我可以查看标头,它确实显示了 multipart/form-data)

4

1 回答 1

1

我没有意识到 multipart/form-data 提交不需要原始 url 编码。一旦我停止对参数进行编码,一切都会按预期工作。

于 2011-08-24T23:55:12.077 回答