【问题标题】:Soundcloud Download TimeoutSoundcloud 下载超时
【发布时间】:2012-10-30 22:08:37
【问题描述】:

soundcloud 有人在看这个吗?为什么我得到一个有效请求的 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 暂时移动 访问控制公开标头: 日期 X-运行时: 20 年龄: 0 内容长度: 28 X-可缓存: 否:缓存控制=无缓存 地点: GDA = 1351783496_b465064be1b41027a7a0bf6067d83169" > http://ak-media.soundcloud.com/kw7JNYi7HtCq?AWSAccessKeyId=AKIAJ4IAZE5EOI7PA7VQ&Expires=1351783496&Signature=UNtBsSfBh1XNvXPLSLNVzTQEclY%3D&的 GDA 强> = 1351783496_b465064be1b41027a7a0bf6067d83169 访问控制允许方法: 获取、放置、发布、删除 联系: 关闭 服务器: nginx X-缓存: 错过 缓存控制: 无缓存 X-清漆: 1398398080 访问控制允许标头: 接受、授权、内容类型、来源 日期: 格林威治标准时间 2012 年 11 月 1 日星期四 15:24:36 访问控制允许来源: * 通过: 1.1 清漆 内容类型: 应用程序/xml;字符集=utf-8

302 - 找到

我还添加了一个 Ti.API.debug(e.error);到我创建的 dlXhr.onerror 函数,这只是返回

【问题讨论】:

    标签: ios http download titanium soundcloud


    【解决方案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();
    

    【讨论】:

    • 嗨 Dawson,我将添加 onerror 功能,只是还没有到那一步,流媒体已经在应用程序中并且工作正常(现在有一个版本没有问题),这里的重点是下载问题是一致的,不是随机的。某些曲目有效,而另一些则无效,这让我想知道这是否与 Soundcloud 有关。
    • 所以我刚刚捕获了一个错误......它完全没用。 {source = "[对象 TiNetworkClient]";类型=错误;这就是它所说的全部
    • 如果你查看 client.status,你会看到你得到了 403。
    • 嗨 Dawson,请看我上面的编辑,我已经在 Soundcloud 自己的 API 控制台上测试过,它给了我一个 302,这对于所有曲目都是一样的,不管我是否可以通过下载它们该应用程序与否。如果请求有效,我相信控制台会返回此信息。我添加了一个调试行,它返回 所以在我看来,这表明 Soundcloud 没有错误。我不确定为什么会给出 403
    • 403 Forbidden 您无权访问您要求的任何内容。然而,当我通过 API 控制台发出相同的 GET 请求时,我得到了正确的 302?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多