【问题标题】:iOS: Download .TXT file give strange resultiOS:下载 .TXT 文件给出奇怪的结果
【发布时间】:2015-05-15 14:20:35
【问题描述】:

我正在尝试在一个网站上下载 5MB 大小的 .txt 文件

我尝试直接下载文件,它给出了正确的大小

我尝试通过 Android DownloadManager.Request 下载,它也提供了正确的大小

除了,在 iOS 中,当我尝试通过 NSURLConnection 下载它时, 没有 1 秒,它显示 5MB 大小的成功下载 但是,当我签入接收它的网络时,我只使用了 25kb?

PS。如果我更改为使用 .zip 文件下载相同的域,它会正确下载

问题链接:http://www.bluewindsolution.com/speed_test/downloads/download_file.txt

工作链接: http://www.bluewindsolution.com/speed_test/downloads/download_file.zip

这里是代码

@IBAction func buttonClick(sender: AnyObject) {
    let timestamp = NSString(format: "%.0f", NSDate().timeIntervalSince1970)
    let url:NSURL = NSURL(string: "http://www.bluewindsolution.com/speed_test/downloads/download_file.txt?time=\(timestamp)")!
    var request:NSURLRequest = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 30.0)
    startDate = NSDate()
    NSURLConnection(request: request, delegate: self)
}

func connectionDidFinishDownloading(connection: NSURLConnection, destinationURL: NSURL) {
    println("finishdownload \(destinationURL)")

    println("timetotal: \(timetotal)")
    println("speed: \(speed) mbps")
    println("filesize: \(filesize)") // it's show 5MB but network just receive only 25KBps ?  it's also not the cache because it's happen at the first time also.

    connection.cancel()
}

func connection(connection: NSURLConnection, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, expectedTotalBytes: Int64) {
    let currentDate:NSDate = NSDate()

    let tt = currentDate.timeIntervalSinceDate(startDate)
    timetotal = tt // to get total time
    speed = Double(totalBytesWritten)/1024/1024*8/tt  // to get speed MBps
    filesize = Double(totalBytesWritten)/1024/1024  // to get as MB

    // use this to get result as real time
    //println("timetotal: \(totaltime)")
    //println("speed: \() mbps")
    //println("filesize: \()")
}

输出结果

模拟器网络接收结果

【问题讨论】:

  • 您是在抱怨文件不全还是没有使用足够的数据? NSURLConnection 自动支持 gzip。服务端有压缩吗?此外,操作系统提供缓存。它被缓存了吗?服务器是否返回 304 Not Modified? Wireshark 无所不知。

标签: ios swift nsurlconnection nsurl


【解决方案1】:

方法connectionDidFinishDownloading 似乎有问题。 请使用以下委托方法,它正在工作

  var mData = NSMutableData()
  func connection(connection: NSURLConnection, didReceiveData data: NSData) {
    mData.appendData(data)
    println("loading")
  }

  func connectionDidFinishLoading(connection: NSURLConnection) {
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString
    let filePath = documentsPath.stringByAppendingPathComponent("text.txt")
    mData.writeToFile(filePath, atomically: true)
    println("\(filePath)")
  }

  func connection(connection: NSURLConnection, didFailWithError error: NSError) {
    println("\(error)")
  }

【讨论】:

  • 我试过你的代码,它给出了与 .txt 文件相同的结果(我也删除了下载委托)
  • 谢谢 Inder,我找到了答案,我把它贴在下面
  • OP 的代码到底有什么问题?我没有看到您的代码有任何改进,只是做得不同。
【解决方案2】:

我建议你使用 Alamofire 库:https://github.com/Alamofire/Alamofire

这是一个简单易用的 HTTP 网络库。

你可以像这样下载文件:

    let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask)

    Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination)

【讨论】:

    【解决方案3】:

    我找到了一个有趣的答案

    我的 download_file.txt 只有字符“x”,大约 500 万个字符变成 5MB

    iOS 有“一些”算法来检查下载文件是否有相同的字符或文本(它也不是缓存),它不需要下载整个 5MB,而是使用仅 25KB 的网络包,然后生成那个重复字符自己?

    在我的测试中,我插入了另一个包含混合字符的文件名 download_file_ios.txt,并下载了完整的 5MB

    我希望有一天这个算法会发布

    PS。感谢@Inder Kumar Rathore 指出我检查下载文件的大小

    网络使用仅 25 KB

    但我得到的文件大小为 5MB

    【讨论】:

    • 该算法可能是压缩/解压缩。我压缩了你的 txt 文件,它只有 7kb
    • 我使用同一个文件,只是改变了它的类型,结果显示,案例 1: .txt .dat .ima .img etc = 它只下载了 25KB 然后生成,案例 2: 。 zip .mp4 和大多数需要执行的类型 = 下载完整的 5MB
    • 我认为你应该深入了解http它是如何下载数据的。
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多