在 swift 3 中下载文件最多只能完成 24 kb?使用 URLSession

Posted

技术标签:

【中文标题】在 swift 3 中下载文件最多只能完成 24 kb?使用 URLSession【英文标题】:Downloading files in swift 3 only completes up to 24 kb? Using URLSession 【发布时间】:2017-01-10 02:24:31 【问题描述】:

我正在使用这个guide 在 swift 3 中下载文件。我试图通过添加某个循环来操纵它,以便能够下载 n 个文件。它可以工作,但最多只能完成 24 kb。

这是我的代码:

for jsonDict in data
  var jasonData = Attachment()

  if let data = (jsonDict["url"] as? String) jasonData.url = data else  jasonData.url = ""

  self.beginDownloadFile(jasonData: jasonData)


func beginDownloadFile(jasonData: Attachment)
        let identifier = jasonData.customer_id + "/attachment/" + jasonData.patient_guid + "@%E%@" + "/" + jasonData.filename + "@%E%@" + jasonData.customer_id  + "@%E%@" + jasonData.patient_guid

        let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: identifier)

        backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)

        var link = self.constants.PATIENTS_PICTURE_LINK + jasonData.customer_id + "/attachment/" + jasonData.guid + "/" + jasonData.filename
        link = link.replacingOccurrences(of: " ", with: "%20")

        let url = URL(string: link)!

        downloadTask = backgroundSession.downloadTask(with: url)
        downloadTask.resume()
    

    func urlSession(_ session: URLSession,
                    downloadTask: URLSessionDownloadTask,
                    didFinishDownloadingTo location: URL)
        let string_container = session.configuration.identifier!.components(separatedBy: "@%E%@")

        let folderPath = string_container[0]
        let fileName = string_container[1]
        let customerID = string_container[2]
        let patientGUID = string_container[3]

        print("GUID IS: " + patientGUID)

        let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
        let documentDirectoryPath:String = path[0]

        let fileManager = FileManager()

        let path1 = documentDirectoryPath.stringByAppendingPathComponent(pathComponent: customerID)
        let path2 = path1.stringByAppendingPathComponent(pathComponent: "attachment")
        let path3 = path2.stringByAppendingPathComponent(pathComponent: patientGUID)

        let destinationURLForFile = URL(fileURLWithPath: path3.appendingFormat(fileName))

        do 
            if !fileManager.fileExists(atPath: path1) 
                try fileManager.createDirectory(atPath: path1, withIntermediateDirectories: false, attributes: nil)
            
            if !fileManager.fileExists(atPath: path2) 
                try fileManager.createDirectory(atPath: path2, withIntermediateDirectories: false, attributes: nil)
            

            if !fileManager.fileExists(atPath: path3) 
                try fileManager.createDirectory(atPath: path3, withIntermediateDirectories: false, attributes: nil)
            

         catch let error as NSError 
            print("ATTACHMENT ERROR: " + error.localizedDescription);
        

        if fileManager.fileExists(atPath: destinationURLForFile.path)
            //showFileWithPath(path: destinationURLForFile.path)
            do 
                try fileManager.removeItem(at: destinationURLForFile)
                try fileManager.moveItem(at: location, to: destinationURLForFile)
                //showFileWithPath(path: destinationURLForFile.path)
            catch
                print("An error occurred while moving/deleting file to destination url")
            
        
        else
            do 
                try fileManager.moveItem(at: location, to: destinationURLForFile)
                //showFileWithPath(path: destinationURLForFile.path)
            catch
                print("An error occurred while moving file to destination url")
            
        
    

结果:

Sample Screenshot

是什么导致它在 24 kb 时停止?是因为循环吗?还是标识符操作?

【问题讨论】:

【参考方案1】:

您声明downloadTask 的代码在哪里?它是实例属性吗?

如果是这样,那么每次循环运行时,您都会丢弃指向 downloadTask 的指针,并且这段代码会运行:

downloadTask = backgroundSession.downloadTask(with: url) downloadTask.resume()

因此,您的任务可能会提前发布。如果是这种情况,那么最后次循环下载应该完成。

另外,24k 是否可能是正确的文件大小?或者可能是静态错误页面的大小?

【讨论】:

会话保留其中的任务。但是,假设我有限的 Swift 知识没有误解这里发生的事情,问题是代码没有保留 session 嗨!抱歉回复晚了,我只是早些时候恢复了编码。似乎这是一个错误页面。我重新检查了我的链接,它的 guid 链接部​​分似乎有问题。虽然它正在工作,但我在做 urlsession 对吗?我将制作文件路径所需的数据放入 urlsession 标识符中。

以上是关于在 swift 3 中下载文件最多只能完成 24 kb?使用 URLSession的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中下载文件[重复]

使用 Selenium 在 IE 中下载文件

从我的 ASP.NET 站点在 Android 3.0 浏览器中下载文件

如何在 iOS 7 中下载文件之前查找文件的大小?

如何在CMD命令中下载文件

如何使用 selenium 在点击事件中下载文件?