2014-09-04 106 views
1

由于各种原因,我正在编写自己的SoundCloud API库,并且遇到了上传声音文件的问题。使用PHP curl自定义SoundCloud API库上传错误

对于我使用PHP和Curl的任务,但SoundCloud在使用PHP时不想接受我的文件。当我从终端上尝试它时,它工作正常,文件成功上传。我用在终端中的以下命令:

curl -i -X POST "https://api.soundcloud.com/tracks" -F 'oauth_token=asdasdasdasd' -F 'track[asset_data][email protected]/home/.../www_data/upload/mpthreetest.mp3' -F 'track[title]=test' 

此我试图PHP卷曲之后但我的git以下错误: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); 

我试图消除从路径的开始@,但并没有帮助。

我在做什么错?

回答

1

正如你刚才所说的,http_build_query是什么混淆了查询。

原因是前面提到的函数将每个特殊字符转换为http符合字符。这意味着@变成%40/变成%20

看起来,cURL之后不会识别给定的字符串实际上是一个路径。在这之外,它发送纯文本。这意味着目标api没有收到二进制文件,而是文件所在的路径。

如果编码是必要的,我会将文件选项与其他文件选项分开,对它们进行编码,然后将其附加。

+0

谢谢您的信息。这是有道理的。 – 2014-09-04 08:43:19

0

解决方案是相当令人不安。

http_build_query()是罪魁祸首。离开这解决了这个问题,上传成功。