2

これを見ているサウンドクラウドの誰かがいますか?有効なリクエストに対して 403 が返されるのはなぜですか?

現在、Titanium を使用して iOS アプリを構築しています。

ユーザーがSoundcloud .mp3ファイルをダウンロードしてアプリから再生できるようにする新機能を含めています(アプリケーションディレクトリに保存)

私が書いたコードは、一部のトラックでは正常に機能しますが、他のトラックでは機能しません。クライアントはすべてのトラックを無制限にダウンロードできます。最大タイムアウトを大幅に増やしましたが、それでも約 170 バイトしかダウンロードせず、一部のトラックで失敗します。他のものでは、問題なくトラック全体をダウンロードします。これに本当に困惑していますが、誰かアイデアはありますか?

以下はコードであり、トラックが機能している例と、機能していないトラックの例を示しています。

ありがとう

ジャスティン

//Download code


var newDir = Titanium.Filesystem.getFile(Titanium.Filesystem.applicationDataDirectory,'scDownloads');

    newDir.createDirectory();

    var id = fStripped;

    var dlXhr = Titanium.Network.createHTTPClient({
        timeout : 500000});

    dlXhr.onload = function(){
        var file = Ti.Filesystem.getFile(newDir.resolve(),id +'.mp3');

        Ti.API.warn('file is: ' + file);

        file.createFile();

        file.write(this.responseData);

    }

    dlXhr.open('GET',dlURL + '?client_id=' + soundcloudClientID);

    dlXhr.send();

そして、ここにいくつかのトラックがあります(クライアントID付き)

これは機能します:https://api.soundcloud.com/tracks/60943956/download?client_id=7a0984726d0eefbb310771c4c02116a8

これはそうではありません: https://api.soundcloud.com/tracks/63980557/download?client_id=7a0984726d0eefbb310771c4c02116a8

これを Soundcloud の API コンソール (http://developers.soundcloud.com/console) でテストしたところ、次の結果が得られました。

HTTP/1.1 302 Moved Temporarily Access-Control-Expose-Headers: Date X-Runtime: 20 Age: 0 Content-Length: 28 X-Cacheable: NO:Cache-Control=no-cache Location: gda=1351783496_b465064be1b41027a7a0bf6067d83169">http: //ak-media.soundcloud.com/kw7JNYi7HtCq?AWSAccessKeyId=AKIAJ4IAZE5EOI7PA7VQ&Expires=1351783496&Signature=UNtBsSfBh1XNvXPLSLNVzTQEclY%3D& gda =1351783496_b465064be1b41027a7a0bf6067d83169 Access-Control-Allow-Methods: GET, PUT, POST, DELETE Con​​nection: close Server: nginx X-Cache: MISS Cache-Control: no-cache X-Varnish: 1398398080 Access-Control-Allow-Headers: Accept、Authorization、Content-Type、Origin Date: Thu, 01 Nov 2012 15:24:36 GMT Access-Control-Allow-Origin: * 経由: 1.1 ワニス Content-Type: application/xml; charset=utf-8

302 - 見つかった

Ti.API.debug(e.error); も追加しました。私が作成したdlXhr.onerror関数に、これは単に返されました

4

1 に答える 1

1

「しない」ものに対して403を取得しています。onerror イベントをリッスンし、適切に処理する必要があります。また、一度にすべてを書き出すのではなく、ファイルをメモリに保持するのではなく、ストリームする必要があります。これを簡単に行うには、iOS の Ti.Network.HTTPClient で使用できる「ファイル」プロパティを利用します。さらに、ダウンロードしている巨大なファイルであるため、進行状況を表示します。以下のサンプルは、これらすべてを示しています。

var win = Ti.UI.createWindow({
    backgroundColor: 'white'
});
var progressBar = Ti.UI.createProgressBar({
    max: 1, min: 0, value: 0,
    left: 20, right: 20,
    height: 20,
    visible: true
});
win.add(progressBar);
win.open();

var fileName = 'file.mp3';
var link = 'https://api.soundcloud.com/tracks/63980557/download?client_id=7a0984726d0eefbb310771c4c02116a8';
var file = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, fileName);

var client = Ti.Network.createHTTPClient({
    ondatastream: function (e) {
        progressBar.value = e.progress;
    },
    onload: function () {
        alert('Download Complete: ' + file.size);
    },
    onerror: function (e) {
        alert(client.status);
    }
});
client.open('GET', link);
client.file = file;
client.send();
于 2012-10-31T15:01:30.267 に答える