出于各种原因,我正在编写自己的SoundCloud API库,并且在上传声音文件时遇到了问题。
对于我使用PHP和Curl的任务,但SoundCloud在使用PHP时不想接受我的文件。当我从终端尝试它时,它工作正常,文件上传成功。我在终端中使用了以下命令:
curl -i -X POST "https://api.soundcloud.com/tracks" -F 'oauth_token=asdasdasdasd' -F 'track[asset_data]=@/home/.../www_data/upload/mpthreetest.mp3' -F 'track[title]=test'
在此之后我尝试了PHP Curl,但我发现了以下错误:Couldn't upload that sound. Couldn't upload that file, sure they're valid soundfiles?
。我也尝试了.mp3
和.wav
文件。
这是我的PHP代码:
$url = "{$this->apiURL}/tracks";
$curl = curl_init();
// Set options
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => http_build_query(array(
'oauth_token' => $this->getToken(),
'track[asset_data]' => '@/home/.../upload/mpthreetest.mp3',
'track[title]' => 'test'))
));
$resp = curl_exec($curl);
var_dump($resp);
curl_close($curl);
我尝试从路径的开头删除@
,但没有帮助。
我做错了什么?
答案 0 :(得分:1)
正如您刚才所说,http_build_query
是弄乱查询的内容。
原因是前面提到的函数将每个特殊字符转换为http符合字符。这意味着@
变为%40
,/
变为%20
。
看起来,cURL之后并不认识到给定的字符串实际上是一个路径。除此之外,它发送纯文本。这意味着目标api没有收到二进制文件,而是接收文件所在的路径。
如果需要编码,我会将文件选项与其他选项分开,对它们进行编码,然后将其附加。
答案 1 :(得分:0)
解决方案非常令人不安。
http_build_query()是罪魁祸首。离开时解决了问题并且上传成功。